$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. } } }
Любая помощь в том, как сделать такую вещь эффективным способом, сэкономит мои дни.
Вот как это будет работать без использования $ 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); } });