<?php
function buildTreeHelper(&$array, $currentLevel = 1)
{
$result = array();
$lastIndex = 0;
while($pair = each($array)) {
list(, $row) = $pair;
$level = $row['level'];
if ($level > $currentLevel) {
$result[$lastIndex]['children'] = buildTreeHelper($array, $level);
} else if ($level == $currentLevel) {
$result[++$lastIndex] = $row;
} else {
prev($array); // shift back
break;
}
}
return $result;
}
function buildTree($array)
{
reset($array);
return buildTreeHelper($array);
}
$array = [
['level'=>1, 'name' => 'Root #1'],
['level'=>1, 'name' => 'Root #2'],
['level'=>2, 'name' => 'subroot 2-1'],
['level'=>3, 'name' => '__subroot 2-1/1'],
['level'=>3, 'name' => '__subroot 2-1/2'],
['level'=>4, 'name' => '__subroot 2-2/1'],
['level'=>2, 'name' => 'subroot 2-2'],
['level'=>2, 'name' => 'subroot 2-3'],
['level'=>1, 'name' => 'Root #3']
];
$time = microtime(true);
var_dump(buildTree($array));
echo round(microtime(true) - $time, 10);
preferences:
33.43 ms | 404 KiB | 5 Q