Итак, я получил этот массив (данные собираются из базы данных):
Array ( [0] => Array ( [id] => 1 [parent_id] => 0 ) [1] => Array ( [id] => 2 [parent_id] => 0 ) [2] => Array ( [id] => 3 [parent_id] => 2 ) [3] => Array ( [id] => 4 [parent_id] => 2 ) [4] => Array ( [id] => 5 [parent_id] => 4 ) )
и я пытаюсь создать и упорядочить массив следующим образом:
Array ( [1] => Array ( [parent_id] => 0 ) [2] => Array ( [parent_id] => 0 [children] => Array ( [3] => Array ( [parent_id] => 2 ) [4] => Array ( [parent_id] => 2 [children] => Array ( [5] => Array ( [parent_id] => 4 ) ) ) ) ) )
и я пробовал со следующим кодом:
function placeInParent(&$newList, $item) { if (isset($newList[$item['parent_id']])) { $newList[$item['parent_id']]['children'][$item['id']] = $item; return true; } foreach ($newList as $newItem) { if (isset($newItem['children'])) { if (placeInParent($newItem['children'], $item)) { return true; } } } return false; } $oldList = (first array above) $newList = array(); foreach ($oldList as $item) { if ($item['parent_id'] == 0) { $newList[$item['id']] = $item; } else { placeInParent($newList, $item); } }
но проблема в том, что я получаю только первые 2 уровня массива! Последняя потеряна .. и мой упорядоченный массив получается следующим образом:
Array ( [1] => Array ( [parent_id] => 0 ) [2] => Array ( [parent_id] => 0 [children] => Array ( [3] => Array ( [parent_id] => 2 ) [4] => Array ( [parent_id] => 2 ) ) ) )
Я просто не могу добраться туда, где я запутался: \ help?
Вы можете сделать это без рекурсии с помощью индекса, который ссылается на узлы внутри дерева:
$arr = array( array('id'=>1, 'parent_id'=>0), array('id'=>2, 'parent_id'=>0), array('id'=>3, 'parent_id'=>2), array('id'=>4, 'parent_id'=>2), array('id'=>5, 'parent_id'=>4), ); // array to build the final hierarchy $tree = array( 'children' => array(), 'path' => array() ); // index array that references the inserted nodes $index = array(0=>&$tree); foreach ($arr as $key => $val) { // pick the parent node inside the tree by using the index $parent = &$index[$val['parent_id']]; // append node to be inserted to the children array $node = array( 'parent_id' => $val['parent_id'], 'path' => $parent['path'] + array($val['id']) ); $parent['children'][$val['id']] = $node; // insert/update reference to recently inserted node inside the tree $index[$val['id']] = &$parent['children'][$val['id']]; }
Окончательный массив, который вы ищете, находится в $tree['children']
.