PHP нажимает значение на массив во время рекурсивного поиска

$menus = [ 0 => [ 'id' => 'home', 'title' => 'Home', 'url' => '/display/home', 'children' => [], 'parent' => null ], 1 => [ 'id' => 'nodes', 'title' => 'Nodes', 'url' => 'nodes/index', 'children' => [ 0 => [ 'id' => 'addNode', 'title' => 'Add Node', 'url' => '/nodes/add', 'children' => [], 'parent' => "nodes" ], 1 => [ 'id' => 'editNode', 'title' => 'Edit Node', 'url' => '/nodes/edit', 'children' => [], 'parent' => 'nodes' ], 2 => [ 'id' => 'deleteNode', 'title' => 'Delete Node', 'url' => '/nodes/delete', 'children' => [ 0 => [ 'id' => 'deleteMultipleNodes', 'title' => 'Delete Multiple Nodes', 'url' => '/nodes/deleteall', 'children' => [ 0 => [ 'id' => 'deleteMultipleSelectedNodes', 'title' => 'Delete Multiple Selected Nodes', 'url' => '/nodes/deleteallselected', 'children' => [], 'parent' => 'deleteMultipleNodes' ] ], 'parent' => 'deleteNode' ] ], 'parent' => 'nodes' ] ], 'parent' => null ] ]; 

Предполагая, что у меня есть этот массив. То, что я хочу, – это рекурсивно искать этот массив для «id», и, если он найден, нажмите новые дочерние элементы в дочерний массив этого элемента.

Я пробовал это по-разному, я также пытался использовать RecursiveArrayIterator для перемещения массива, но проблема в том, как я могу направить значение на этот индекс массива при обнаружении во время прохождения.

Например, здесь приведен код из одной из моих попыток:

 private function traverseArray($array) { $child = [ 'id' => 'deleteMultipleNotSelectedNodes', 'title' => 'Delete Multiple Not Selected Nodes', 'url' => '/nodes/deletenotselected', 'children' => [], 'parent' => 'deleteMultipleNodes' ]; foreach($array as $key=>$value) { if(is_array($value)) { $this->traverseArray($value); } if($key == "id" && $value == "deleteMultipleNodes") { array_push($array["children"], $child); // This part is confusing me, How to add the child on this index where the id is found. } } } 

Любая помощь в том, как сделать такую ​​вещь эффективным способом, сэкономит мои дни.

Related of "PHP нажимает значение на массив во время рекурсивного поиска"

Вот как это будет работать без использования $ this и исправления ошибок при сравнении значения $, вместо чего присваивается значение для значения.

Обратите внимание на разницу с & $ array и & $ value, которые являются ссылками, поэтому вместо исходных данных они будут заменять новые переменные.

 <?php $menus = [ 0 => [ 'id' => 'home', 'title' => 'Home', 'url' => '/display/home', 'children' => [], 'parent' => null ], 1 => [ 'id' => 'nodes', 'title' => 'Nodes', 'url' => 'nodes/index', 'children' => [ 0 => [ 'id' => 'addNode', 'title' => 'Add Node', 'url' => '/nodes/add', 'children' => [], 'parent' => "nodes" ], 1 => [ 'id' => 'editNode', 'title' => 'Edit Node', 'url' => '/nodes/edit', 'children' => [], 'parent' => 'nodes' ], 2 => [ 'id' => 'deleteNode', 'title' => 'Delete Node', 'url' => '/nodes/delete', 'children' => [ 0 => [ 'id' => 'deleteMultipleNodes', 'title' => 'Delete Multiple Nodes', 'url' => '/nodes/deleteall', 'children' => [ 0 => [ 'id' => 'deleteMultipleSelectedNodes', 'title' => 'Delete Multiple Selected Nodes', 'url' => '/nodes/deleteallselected', 'children' => [], 'parent' => 'deleteMultipleNodes' ] ], 'parent' => 'deleteNode' ] ], 'parent' => 'nodes' ] ], 'parent' => null ] ]; function traverseArray(&$array) { $child = [ 'id' => 'deleteMultipleNotSelectedNodes', 'title' => 'Delete Multiple Not Selected Nodes', 'url' => '/nodes/deletenotselected', 'children' => [], 'parent' => 'deleteMultipleNodes' ]; foreach($array as $key=>&$value) { if(is_array($value)) { traverseArray($value); } if($key == "id" && $value == "deleteMultipleNodes") { array_push($array["children"], $child); } } } echo "=== before \n"; var_export($menus); echo "\n\n"; traverseArray($menus); echo "=== after \n"; var_export($menus); 

Может быть, это поможет вам. array_walk_recursive будет проходить через все элементы. А функция обратного вызова может получать $value по ссылке. Таким образом, при изменении $value это изменит элемент в исходном массиве.

 array_walk_recursive($array, function (&$value, $key) { if(is_array($value) && $value['id'] === "deleteMultipleNodes") { $child = [ 'id' => 'deleteMultipleNotSelectedNodes', 'title' => 'Delete Multiple Not Selected Nodes', 'url' => '/nodes/deletenotselected', 'children' => [], 'parent' => 'deleteMultipleNodes' ]; array_push($value['children'], $child); } });