Комментарии 27
global $array; global $array_idx_lvl; //Индекс по level global $groups;
2016 год на дворе, а вы все глобальные переменные используете.
и по поводу деревьев можете глянуть сюда — http://gsbelarus.com/pw/articles/post/derev-ia-v-sql/
в статье описаны способы, которыми можно Ваши проблемы решить на корню чтоб не городить лишнего
Отличная статья, спасибо за ссылку, но там более серьёзный подход, во всём что написано нужно разбираться… как ни будь обязательно потрачу время…
этот код написан на коленке, на скорую руку, вот на global вы обратили внимание, а на эту конструкцию «LDAP::getGroups» почему то нет))
этот код написан на коленке, на скорую руку, вот на global вы обратили внимание, а на эту конструкцию «LDAP::getGroups» почему то нет))
- Рекомендую вам освоить ООП и научиться пользоваться объектами. Все ваши глобальные функции и переменные вполне можно инкапсулировать в объект класса Tree.
- Заполнение дерева вполне можно сделать без рекурсии. Вот пример для объектов, для массивов можно сделать аналогично, только надо вручную указывать доступ по ссылке.
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 каждого документа нам пришлось бы обойти сотни строк, это несёт большие накладные расходы
Вы проводили измерения, на сколько миллисекунд у вас увеличивается время загрузки страницы при обработке сотни элементов вместо десяти?
1. Ну причём тут ООП… не обращайте внимание на код, естественно финальный вариант будет упакован в класс, я лишь описал свою логику, которая вобщем то работает…
2. Не совсем понял идею
3. По-моему не слишком оптимально, во всяком случае не оставлю без внимания, найду время и проведу сравнительный тест, спасибо.
2. Не совсем понял идею
3. По-моему не слишком оптимально, во всяком случае не оставлю без внимания, найду время и проведу сравнительный тест, спасибо.
Ждём статью "пишем echo"
НЛО прилетело и опубликовало эту надпись здесь
Честно говоря, настолько глубоко в изучение деревьев не погружался,
простая логика, простое исполнение, так сказать конкретный рабочий пример. Этот материал скорее для новичков, понять суть…
А за наводку спасибо, нашёл даже пару хороших статей по nested sets, почитаем…
простая логика, простое исполнение, так сказать конкретный рабочий пример. Этот материал скорее для новичков, понять суть…
А за наводку спасибо, нашёл даже пару хороших статей по nested sets, почитаем…
А стоило бы изучить этот вопрос несколько глубже. Я вот на хабр «ворвался», тоже с довольно тривиальным примером. Без понятия, как меня с ним вообще «захабрили». Но вот к его изучению и рассмотрению, я подошел довольно основательно.
Однако, как можно было миновать четрые основных паттерна (al, ns, mp и ct) при изучении деревьев? Ума не приложу…
Однако, как можно было миновать четрые основных паттерна (al, ns, mp и ct) при изучении деревьев? Ума не приложу…
Послушайте, тут задачка то простая, и решена она просто, парой функций. Я не говорил что представляю грааль,
я показал как это можно сделать просто и быстро.
Вы когда на обочине, меняете колесо на машине, всегда пользуетесь динамометрическим ключём и смотрите в книге моменты затяжки болтов? Думаю нет.
Будь это коммерческий проект, естественно подход был бы несколько другим. Видимо вначале мне всё же стоило написать «Это материал для новичков, гуру просим не читать.»
я показал как это можно сделать просто и быстро.
Вы когда на обочине, меняете колесо на машине, всегда пользуетесь динамометрическим ключём и смотрите в книге моменты затяжки болтов? Думаю нет.
Будь это коммерческий проект, естественно подход был бы несколько другим. Видимо вначале мне всё же стоило написать «Это материал для новичков, гуру просим не читать.»
Послушайте, тут задачка то простая, и решена она просто, парой функций.
я бы не смог сказать лучше
НЛО прилетело и опубликовало эту надпись здесь
Честно, я не придумал ничего лучше, как обойти всё, иначе я не представляю как можно определить какой элемент показывать, а какой нет.
НЛО прилетело и опубликовало эту надпись здесь
Смысл статьи немного в другом… я просто кинул текстовый файл в корень web сервера и назвал его index.php, считайте что в реальном проекте эти стоки выглядят так:
$this->array;
$this->array_idx_lvl; //Индекс по level
$this->groups; //доменные группы
$this->array;
$this->array_idx_lvl; //Индекс по level
$this->groups; //доменные группы
НЛО прилетело и опубликовало эту надпись здесь
За конкретные примеры спасибо, всегда приятно когда разговор по существу, а не понты и метание умных красивых слов как зачастую тут бывает…
В конструкторе вместо reduce'a для группировки по ключу можно(наглядней) использовать array_column — array_column($items, null, 'uid')
НЛО прилетело и опубликовало эту надпись здесь
Не вы одни :) Если еще не видели — там есть полифилл — github.com/ramsey/array_column/blob/master/src/array_column.php
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Рекурсия на PHP — алгоритм, применение