Нужно отсортировать массив, чтобы дочерние элементы шли сразу после родителя. Сложность в том, что в корне не обязательно будут стоять элементы с parentId = 0, начинаться могут деревья с любого элемента.
function sortByParents(array &$array, $parentId = 0, &$result = [])
{
foreach ($array as $key => $value) {
if ($value['parentId'] == $parentId) {
array_push($result, $value);
unset($array[$key]);
$this->sortByParents($array, $value['id'], $result);
}
}
return $result;
}
Как можно доработать функцию?
upd: пример данных
начальный массив:
[
'id' => 23,
'parentId' => 21,
],[
'id' => 25,
'parentId' => 0,
],[
'id' => 28,
'parentId' => 25,
],[
'id' => 31,
'parentId' => 22,
],[
'id' => 32,
'parentId' => 25,
],[
'id' => 34,
'parentId' => 0,
],[
'id' => 35,
'parentId' => 0,
],[
'id' => 37,
'parentId' => 0,
],[
'id' => 38,
'parentId' => 0,
],[
'id' => 39,
'parentId' => 40,
],[
'id' => 40,
'parentId' => 21,
]
результат:
[
'id' => 25,
'parentId' => 0,
],[
'id' => 28,
'parentId' => 25,
],[
'id' => 32,
'parentId' => 25,
],[
'id' => 34,
'parentId' => 0,
],[
'id' => 35,
'parentId' => 0,
],[
'id' => 37,
'parentId' => 0,
],[
'id' => 38,
'parentId' => 0,
],[
'id' => 23,
'parentId' => 21, // выше нет родителя с id = 21
],[
'id' => 40,
'parentId' => 21,
],[
'id' => 39,
'parentId' => 40,
],[
'id' => 31,
'parentId' => 22, // выше нет родителя с id = 22
]
Продвижение своими сайтами как стратегия роста и независимости