<?php
array("id" => 1, "parentId" => null, "text" => "Первая строка"), array("id" => 2, "parentId" => 3, "text" => "Вторая строка"), array("id" => 3, "parentId" => 1, "text" => "Третья строка"), array("id" => 4, "parentId" => 1, "text" => "Четвертая строка"), array("id" => 5, "parentId" => null, "text" => "Второй корень"), array("id" => 6, "parentId" => 5, "text" => "Ребёнок второго корня"), array("id" => 7, "parentId" => 6, "text" => "Седьмая строка"), array("id" => 8, "parentId" => 7, "text" => "Восьмая строка"), );
function fillWithChildren
(array $adjacencyList) { $nodesWithChildren = [];
foreach ($adjacencyList as $node) {
$nodesWithChildren[$node['parentId']] = [];
}
$nodesWithChildren[$node['parentId']][] = $node;
}
return $nodesWithChildren;
}
function printList
(array $nodes, $parentId = null, $depth = 0) { foreach ($nodes[$parentId] as $node) {
visitNode($node, $depth);
if (!empty($nodes[$node['id']])) { printList($nodes, $node['id'], $depth + 1);
}
}
}
function visitNode
(array $node, $depth) { echo str_repeat('-', $depth) . $node['text'] . PHP_EOL
; }
printList(fillWithChildren($adjacencyList));
PD9waHAKCiRhZGphY2VuY3lMaXN0ID0gYXJyYXkoCiAgICBhcnJheSgiaWQiID0+IDEsICJwYXJlbnRJZCIgPT4gbnVsbCwgInRleHQiID0+ICLQn9C10YDQstCw0Y8g0YHRgtGA0L7QutCwIiksIAogICAgYXJyYXkoImlkIiA9PiAyLCAicGFyZW50SWQiID0+IDMsICAgICJ0ZXh0IiA9PiAi0JLRgtC+0YDQsNGPINGB0YLRgNC+0LrQsCIpLCAKICAgIGFycmF5KCJpZCIgPT4gMywgInBhcmVudElkIiA9PiAxLCAgICAidGV4dCIgPT4gItCi0YDQtdGC0YzRjyDRgdGC0YDQvtC60LAiKSwKICAgIGFycmF5KCJpZCIgPT4gNCwgInBhcmVudElkIiA9PiAxLCAgICAidGV4dCIgPT4gItCn0LXRgtCy0LXRgNGC0LDRjyDRgdGC0YDQvtC60LAiKSwKICAgIGFycmF5KCJpZCIgPT4gNSwgInBhcmVudElkIiA9PiBudWxsLCAidGV4dCIgPT4gItCS0YLQvtGA0L7QuSDQutC+0YDQtdC90YwiKSwgCiAgICBhcnJheSgiaWQiID0+IDYsICJwYXJlbnRJZCIgPT4gNSwgInRleHQiID0+ICLQoNC10LHRkdC90L7QuiDQstGC0L7RgNC+0LPQviDQutC+0YDQvdGPIiksIAogICAgYXJyYXkoImlkIiA9PiA3LCAicGFyZW50SWQiID0+IDYsICJ0ZXh0IiA9PiAi0KHQtdC00YzQvNCw0Y8g0YHRgtGA0L7QutCwIiksIAogICAgYXJyYXkoImlkIiA9PiA4LCAicGFyZW50SWQiID0+IDcsICJ0ZXh0IiA9PiAi0JLQvtGB0YzQvNCw0Y8g0YHRgtGA0L7QutCwIiksIAopOwoKZnVuY3Rpb24gZmlsbFdpdGhDaGlsZHJlbihhcnJheSAkYWRqYWNlbmN5TGlzdCkgewogICAgJG5vZGVzV2l0aENoaWxkcmVuID0gW107CiAgICBmb3JlYWNoICgkYWRqYWNlbmN5TGlzdCBhcyAkbm9kZSkgewogICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRub2RlWydwYXJlbnRJZCddLCAkbm9kZXNXaXRoQ2hpbGRyZW4pKSB7CiAgICAgICAgICAgJG5vZGVzV2l0aENoaWxkcmVuWyRub2RlWydwYXJlbnRJZCddXSA9IFtdOwogICAgICAgfQogICAgICAgJG5vZGVzV2l0aENoaWxkcmVuWyRub2RlWydwYXJlbnRJZCddXVtdID0gJG5vZGU7CiAgICB9CiAgICByZXR1cm4gJG5vZGVzV2l0aENoaWxkcmVuOwp9CgpmdW5jdGlvbiBwcmludExpc3QoYXJyYXkgJG5vZGVzLCAkcGFyZW50SWQgPSBudWxsLCAkZGVwdGggPSAwKSB7CiAgIGZvcmVhY2ggKCRub2Rlc1skcGFyZW50SWRdIGFzICRub2RlKSB7CiAgICAgICB2aXNpdE5vZGUoJG5vZGUsICRkZXB0aCk7CiAgICAgICBpZiAoIWVtcHR5KCRub2Rlc1skbm9kZVsnaWQnXV0pKSB7CiAgICAgICAgICAgcHJpbnRMaXN0KCRub2RlcywgJG5vZGVbJ2lkJ10sICRkZXB0aCArIDEpOwogICAgICAgfSAgICAgICAgICAgCiAgIH0KfQoKZnVuY3Rpb24gdmlzaXROb2RlKGFycmF5ICRub2RlLCAkZGVwdGgpIHsKICAgIGVjaG8gc3RyX3JlcGVhdCgnLScsICRkZXB0aCkgLiAkbm9kZVsndGV4dCddIC4gUEhQX0VPTDsKfQoKcHJpbnRMaXN0KGZpbGxXaXRoQ2hpbGRyZW4oJGFkamFjZW5jeUxpc3QpKTsK