3v4l.org

run code in 300+ PHP versions simultaneously
<?php $arr = array( array('id' => 1, 'title' => 'a', 'parent' => 0), array('id' => 2, 'title' => 'b', 'parent' => 1), array('id' => 3, 'title' => 'c', 'parent' => 1), array('id' => 5, 'title' => 'e', 'parent' => 0), array('id' => 6, 'title' => 'f', 'parent' => 5), array('id' => 7, 'title' => 'g', 'parent' => 5), array('id' => 8, 'title' => 'h', 'parent' => 0), array('id' => 9, 'title' => 'k', 'parent' => 8), array('id' => 10, 'title' => 'l', 'parent' => 8), array('id' => 11, 'title' => 'm', 'parent' => 10), array('id' => 12, 'title' => 'n', 'parent' => 10), ); function lookForParent($array, $id, $title) { $return = array(); for($i = 0; $i <= count($array); $i++) { //Look for the parent on the second level if(isset($array[$i][$id])) { $return[$i][$id][] = $title; break; } else { if(!empty($array[$i])) { $return_val = lookForParent($array[$i], $id, $title); if(!empty($return_val)) { $return[$i][$id][] = $return_val; break; } } } } return $return; } $new = array(); foreach($arr as $val) { if($val['parent'] > 0) { if(isset($new[$val['parent']])) { //Look if the parent exist on the first level $new[$val['parent']][$val['id']][] = $val['title']; } else { for($i = 0; $i <= count($new); $i++) { $return = lookForParent($new[$i], $val['id'], $val['title']); if(!empty($return)) { $new = array_merge($new, $return); } } } } else { $new[$val['id']][] = $val['title']; } } var_dump($new);

preferences:
53.86 ms | 402 KiB | 5 Q