Рекурсивный порядок массива с id и parent_id структурой

Итак, я получил этот массив (данные собираются из базы данных):

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'] .