function rebuild(array $array) {
$count_children = [];
$without_children = [];
foreach ($array as $id => $element) {
// инициализация подсчета дочерних элементов, если это еще не было сделано
if (!isset($count_children[$id])) {
$count_children[$id] = 0;
}
if ($count_children[$id] === 0) {
$without_children[] = $id;
}
if ($element['pos'] === 0) {
continue;
}
// инкремент кол-ва дочерних элементов для родительского эл-та
if ( !isset($count_children[$element['pos']]) ) {
$count_children[$element['pos']] = 0;
}
$count_children[$element['pos']]++;
// удаление родительского эл-та из списка "бездочерних" элементов
if (($key = array_search($element['pos'], $without_children)) !== false) {
unset($without_children[$key]);
}
}
while(!empty($without_children)) {
foreach ($without_children as $key => $id) {
$parent_id = $array[$id]['pos'];
if ($parent_id !== 0) {
if (!isset($array[ $parent_id ]['playlist'])) {
$array[ $parent_id ]['playlist'] = [];
}
$array[$parent_id]['playlist'][] = $array[$id];
unset($array[$id]);
$count_children[$parent_id]--;
if ($count_children[$parent_id] <= 0 && $parent_id !== 0) {
$without_children[] = $parent_id;
}
}
unset($without_children[$key]);
}
}
return $array;
}
function arrayToNestedKeys(array $keys, array $insertInto, $value) {
$tmp = &$insertInto;
foreach ($keys as $key) {
if (!isset($tmp[$key]) || !is_array($tmp[$key])) {
$tmp[$key] = [];
}
$tmp[$key] = [];
$tmp = &$tmp[$key];
}
$tmp = $value;
return $insertInto;
}
// arrayToNestedKeys([78,2,3], [123], 6) выдаст
// [0 => 123, 78 => [2 => [3 => 6]]]