Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
global $array; global $array_idx_lvl; //Индекс по level global $groups;
function getDocumentTree()
{
$documents = Document::find()->indexBy('id')->all();
$topLevelDocuments = [];
foreach ($documents as $document) {
if ($document->parent_id) {
$parentDocument = $documents[$document->parent_id];
$document->parentDocument = $parentDocument;
$parentDocument->childDocuments[$document->id] = $document;
} else {
$topLevelDocuments[$document->id] = $document;
}
}
return $topLevelDocuments;
}foreach ($array as $uid => $row) {
$node = $row;
if ($node['access'] == 'allow') {
// поднимаемся вверх по ветке, разрешаем просмотр для родительских узлов
$pid = $row['pid'];
while ($pid != null) {
$node = $array[$pid];
$node['view'] = 'show';
$pid = $node['pid'];
}
}
}сравнивая level каждого документа нам пришлось бы обойти сотни строк, это несёт большие накладные расходы
Послушайте, тут задачка то простая, и решена она просто, парой функций.
Рекурсия на PHP — алгоритм, применение