За последние 24 часа нас посетили 20578 программистов и 1130 роботов. Сейчас ищут 787 программистов ...

Как редактировать array через указатель?

Тема в разделе "PHP для профи", создана пользователем YVDev, 30 мар 2022.

  1. YVDev

    YVDev Новичок

    С нами с:
    30 мар 2022
    Сообщения:
    2
    Симпатии:
    0
    Есть такое:
    PHP:
    1. class CLASS_A{
    2. ...
    3.   private array $data = array(); // многомерный, именованный
    4. ...
    5.   /** получаем ссылку на ветвь в дереве */
    6.   function &getArray(string $path): array{
    7.         $_a = &$this->data;
    8.         if (strlen($path) === 0){return $_a;}
    9.         $_p = explode('.', $path);
    10.         foreach($_p as $name){
    11.             $_a = $_a[$name];
    12.         }
    13.         return $_a;
    14.   }
    15.   /** добавляем */
    16.   function add(array $data, string $toPath = ""): void{
    17.         $_to = $this->getArray($toPath);
    18.         foreach(array_keys($data) as $name){$_to[$name] = $data[$name];}
    19.   }
    20.   //* изменяем */
    21.   function edit(string $data, string $name, string $toPath = ""): void{
    22.         $this->getArray($toPath)[$name] = $data;
    23.   }
    24. ...
    25. }
    Естественно, так не работает. Так как во время $_to[$name] = $data[$name]; $_to - похоже, перестаёт быть ссылкой, и становится копией. Как выкрутиться в этой ситуации?
     
  2. YVDev

    YVDev Новичок

    С нами с:
    30 мар 2022
    Сообщения:
    2
    Симпатии:
    0
    Нашел ошибку у себя:
    PHP:
    1. class CLASS_A{
    2. ...
    3.       private array $data = array(); // многомерный, именованный
    4. ...
    5.       /** получаем ссылку на ветвь в дереве */
    6.       function &getArray(string $path): array{
    7.             $_a = &$this->data;
    8.             if (strlen($path) === 0){return $_a;}
    9.             $_p = explode('.', $path);
    10.             foreach($_p as $name){
    11.                 $_a = &$_a[$name]; // --> тут нужен амперсанд
    12.             }
    13.             return $_a;
    14.       }
    15.       /** добавляем */
    16.       function add(array $data, string $toPath = ""): void{
    17.             $_to = &$this->getArray($toPath); // --> и тут тоже нужен амперсанд
    18.             foreach(array_keys($data) as $name){$_to[$name] = $data[$name];}
    19.       }
    20.       //* изменяем */
    21.       function edit(string $data, string $name, string $toPath = ""): void{
    22.          $this->getArray($toPath)[$name] = $data;
    23.       }
    24. ...
    25. }