Получить ссылку на элемент массива php, который ищется по ключу - PullRequest
0 голосов
/ 17 мая 2019

У меня есть следующая структура массива php:

$r = [
 [
   'id' => 'abc',
   'children' => [
      [
        'id' => 'def',
        'children' => []
      ],
      [
        'id' => 'ghi',
        'children' => [
          [
            'id' => 'jkl',
            'children' => []
          ],
          [
            'id' => 'mno',
            'children' => []
          ]
        ]
      ]
    ]
  ]
]

и функция для поиска родителя, например:

function &getElementByUuid($element, $uuid){
    foreach($element as $child){
        if($child['id'] == $uuid){
            return $child;
        }
        if(isset($child['children'])){
            if($childFound = $this->getElementByUuid($child['children'], $uuid)){
                return $childFound;
            }
        }
    }
    return false;
}

, вызывающая это по

getElementByUuid($r, 'ghi');

Поиск уже работает отлично, так как он возвращает родительский элемент, я хочу добавить дочерние элементы.

Но мне нужно получить найденный родительский элемент массива в качестве ссылки, чтобы я мог добавить к нему элементы массива.

Как:

$parent = getElementByUuid($r, 'ghi');
$parent['children'][] = [
  'id' => 'xyz',
  'children' => []
];

Но я не могу получить родительский элемент в качестве ссылки, хотя я пометил метод с помощью &, чтобы вернуть ссылку, а не значение.

Любая помощьна этом было бы здорово.

Заранее спасибо :))

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Вам также нужно пройти по массиву по ссылке и добавить амперсанд перед вызовом функции. Вот небольшой пример того, как вернуться по ссылке: https://3v4l.org/7seON

<?php

$ar = [1,2,3,4];

function &refS(&$ar, $v) {
    foreach ($ar as &$i) {
        if ($i === $v) {
            return $i;
        }
    }
}

$x = &refS($ar, 2);
var_dump($x);
$x = 22;
var_dump($ar);
0 голосов
/ 17 мая 2019

Я просто тупой ...

Звоните:

$parent =& $this->getElementByUuid($tree, $parentId);

и метод должен выглядеть следующим образом:

function &getElementByUuid(&$element, $uuid){
    foreach($element as &$child){
        if($child['id'] == $uuid){
            return $child;
        }
        if(isset($child['children'])){
            if($childFound =& $this->getElementByUuid($child['children'], $uuid)){
                return $childFound;
            }
        }
    }
    return false;
}

Иначе, php создает копию значений и перебирает значения, возвращает ссылку на копию, а не ссылку на ссылку.

Я надеюсь, что это может помочь кому-то еще;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...