У меня есть многомерный массив, который выглядит так
[0] => Array ( [recordId] => 5 [leaf] => 1 [children] => Array ( [0] => Array ( [recordId] => 6 [leaf] => 1 [children] => Array ( [0] => Array ( [recordId] => 7 [leaf] => 1 ) ) ) [1] => Array ( [recordId] => 8 [leaf] => 1 [children] => Array ( [0] => Array ( [recordId] => 9 [leaf] => 1 ) [1] => Array ( [recordId] => 10 [leaf] => 1 ) ) ) ) )
Каждый узел имеет ключ «лист», который по умолчанию имеет значение «ИСТИНА» и имеет «дочерний» массив, если есть другие узлы вниз.
Мне нужно установить значение ключа «leaf» в FALSE, если в нем есть «дочерний» массив. Таким образом, только конечные узлы имеют обозначение leaf = TRUE.
Я пробовал поиск, но не могу найти код, чтобы делать то, что мне нужно, и я не могу обернуть голову вокруг рекурсивной функции, которая, я считаю, необходима.
Любые идеи, как я мог бы это сделать в PHP?
Спасибо за помощь.
Теоретически это должно работать:
function findChild(&$array){ foreach($array as &$arr){ if(isset($arr['children'])){ $arr['leaf'] = 0; //there are children findChild($arr['children']); } else { $arr['leaf'] = 1; //there are no children } } }
Вот рабочая демонстрация: http://codepad.org/AnYiRpES
Довольно просто:
function leafOrNotLeaf(array $array) { foreach ($array as $key => $sub) { if (isset($sub['children'])) { $array[$key]['leaf'] = false; $array[$key]['children'] = leafOrNotLeaf($sub['children']); } } return $array; } $new_array = leafOrNotLeaf($array);
Прогулка по фактическому $array
:
array_walk($array, $walker = function (&$node) use (&$walker) { $node['leaf'] = (int) empty($node['children']) OR array_walk($node['children'], $walker); });
Может быть, немного загадочно, поэтому вам нужно любить PHP.