<?php
$array = array(
55 => array(
'ident' => 'test 1',
'depth' => 1,
),
77 => array(
'parent_id' => 55,
'ident' => 'test 2',
'depth' => 2,
),
109 => array(
'parent_id' => 77,
'ident' => 'test 3',
'depth' => 3,
),
78 => array(
'parent_id' => 55,
'ident' => 'test 4',
'depth' => 2,
),
25 => array(
'ident' => 'test 5',
'depth' => 1,
)
);
function v1($array) {
foreach ($array as $key => &$sub) {
if (isset($sub['parent_id'])) {
$array[$sub['parent_id']]['children'][$key] = &$sub;
}
}
unset($sub); // unset the reference to make sure to not overwrite it later...
// now remove the entries with parents
foreach ($array as $key => $sub) {
if (isset($sub['parent_id']))
unset($array[$key]);
}
return $array;
}
function push_at_key($what, $what_key, $key, $array) {
foreach($array as $k => $v) {
if($key == $k) {
$array[$k]['children'][$what_key] = $what;
return $array;
}
}
foreach($array as $k => $v) {
$array[$k] = push_at_key($what, $what_key, $key, $v['children']);
}
return $array;
}
function v2($array) {
$out = array();
foreach ($array as $key => $sub) {
if(!isset($sub['parent_id'])) {
$out[$key] = $sub;
}
else {
$out = push_at_key($sub, $key, $sub['parent_id'], $out);
}
}
return $out;
}
//var_dump(v1($array));
var_dump(v2($array));
preferences:
36.19 ms | 402 KiB | 5 Q