Как стать автором
Обновить

Комментарии 27

 global $array;
    global $array_idx_lvl; //Индекс по level
    global $groups; 

2016 год на дворе, а вы все глобальные переменные используете.
и по поводу деревьев можете глянуть сюда — http://gsbelarus.com/pw/articles/post/derev-ia-v-sql/
в статье описаны способы, которыми можно Ваши проблемы решить на корню чтоб не городить лишнего
Отличная статья, спасибо за ссылку, но там более серьёзный подход, во всём что написано нужно разбираться… как ни будь обязательно потрачу время…
этот код написан на коленке, на скорую руку, вот на global вы обратили внимание, а на эту конструкцию «LDAP::getGroups» почему то нет))
тогда и на
$PDO->query("SELECT * FROM Test");

и на отстутствие phpdoc к функциям стоило бы. Просто глобальные переменные прям бросаются в глаза. А статью все же перечитайте — потратите немного на ее чтение, потом сэкономите кучу времени при работе с подобными задачами
  1. Рекомендую вам освоить ООП и научиться пользоваться объектами. Все ваши глобальные функции и переменные вполне можно инкапсулировать в объект класса Tree.

  2. Заполнение дерева вполне можно сделать без рекурсии. Вот пример для объектов, для массивов можно сделать аналогично, только надо вручную указывать доступ по ссылке.
    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;
    }


  3. Не очень понял ваши рассуждения про самозапуски, но рекурсия здесь тоже не нужна. Можно сделать что-то типа такого (псевдокод, в работе не проверял):
    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'];
            }
        }
    }

  4. сравнивая level каждого документа нам пришлось бы обойти сотни строк, это несёт большие накладные расходы

    Вы проводили измерения, на сколько миллисекунд у вас увеличивается время загрузки страницы при обработке сотни элементов вместо десяти?
1. Ну причём тут ООП… не обращайте внимание на код, естественно финальный вариант будет упакован в класс, я лишь описал свою логику, которая вобщем то работает…
2. Не совсем понял идею
3. По-моему не слишком оптимально, во всяком случае не оставлю без внимания, найду время и проведу сравнительный тест, спасибо.
По-моему вы не правы. Не всем данная тема может показаться тривиальной. Очень много новичков просто не знают с чего начать. Я буду рад если написанное выше кому то будет полезным…
Как же это так, новички не знают с чего начать… А гугл? Уж сегодня, в 2016 году, гугл ничего не находит подобных примеров данной тематике?
Теперь будет на один больше). Много теории гугл находит, а вот законченных решений, где расписано от и до, к сожалению не так уж и много.
НЛО прилетело и опубликовало эту надпись здесь
Честно говоря, настолько глубоко в изучение деревьев не погружался,
простая логика, простое исполнение, так сказать конкретный рабочий пример. Этот материал скорее для новичков, понять суть…
А за наводку спасибо, нашёл даже пару хороших статей по nested sets, почитаем…
А стоило бы изучить этот вопрос несколько глубже. Я вот на хабр «ворвался», тоже с довольно тривиальным примером. Без понятия, как меня с ним вообще «захабрили». Но вот к его изучению и рассмотрению, я подошел довольно основательно.
Однако, как можно было миновать четрые основных паттерна (al, ns, mp и ct) при изучении деревьев? Ума не приложу…
Послушайте, тут задачка то простая, и решена она просто, парой функций. Я не говорил что представляю грааль,
я показал как это можно сделать просто и быстро.
Вы когда на обочине, меняете колесо на машине, всегда пользуетесь динамометрическим ключём и смотрите в книге моменты затяжки болтов? Думаю нет.
Будь это коммерческий проект, естественно подход был бы несколько другим. Видимо вначале мне всё же стоило написать «Это материал для новичков, гуру просим не читать.»
Послушайте, тут задачка то простая, и решена она просто, парой функций.

я бы не смог сказать лучше
Напишешь доступно — заминусуют за банальность, потому что поэтому задавать глупые вопросы лучше гуглу?
Я думал тут карму сливают за копипаст, или неадекватное поведение, оскорбления и прочее,
а тут оказывается и за труды можно в нехорошие попасть? Мда… людишки видать тут те ещё собрались…
НЛО прилетело и опубликовало эту надпись здесь
Честно, я не придумал ничего лучше, как обойти всё, иначе я не представляю как можно определить какой элемент показывать, а какой нет.
НЛО прилетело и опубликовало эту надпись здесь
Это уже стиль программирования. Одному удобнее так, другому так,
некоторые юзают паттерн registry во всех своих разработках, другие же считают что это лишает портабельности и объекты нужно передавать в другие классы при инициализации. Боюсь мы ушли от сути статьи…
НЛО прилетело и опубликовало эту надпись здесь
Смысл статьи немного в другом… я просто кинул текстовый файл в корень web сервера и назвал его index.php, считайте что в реальном проекте эти стоки выглядят так:
$this->array;
$this->array_idx_lvl; //Индекс по level
$this->groups; //доменные группы
НЛО прилетело и опубликовало эту надпись здесь
За конкретные примеры спасибо, всегда приятно когда разговор по существу, а не понты и метание умных красивых слов как зачастую тут бывает…
В конструкторе вместо reduce'a для группировки по ключу можно(наглядней) использовать array_column — array_column($items, null, 'uid')
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории