PHP RecursiveIteratorIterator и вложенные наборы

Я думаю, что инструменты разработчика Chrome могут помочь вам определить, какой click слушатель вам нужен, поэтому откройте свою страницу в браузере Google Chrome, затем щелкните правой кнопкой мыши (для Windows) или дважды нажмите на сенсорной панели ( Mac Os), затем:

  1. Выберите опцию Inspect в контекстном меню
  2. Откроется окно с инструментами разработчика, затем выберите вкладку Sources
  3. Затем на правой панели вы увидите несколько аккордеонных панелей, перейдите на Event Listeners Breakpoints
  4. . Откройте панель Mouse и отметьте click и mousedown события
  5. Обновить. Если вы начнете нажимать на элементы, чтобы выяснить, какое событие вам нужно, вы заметите, что на сайте появится светло-серебряный оверлейный слой, так что вы можете переходить к следующему слушателю, пока не найдете то, что искали.

Вы можете найти больше информации в Google Chrome Developer Tools

5
задан Glorfindel 28 February 2019 в 11:02
поделиться

2 ответа

Я понял это, вот решение (simplifed):

$iterator = new RecursiveIteratorIterator(
    new Site_Node_List(array($root)),
    RecursiveIteratorIterator::SELF_FIRST);

$sides = array();
$s = 0;
$i = 0;
$parents = array();
foreach ($iterator as $item) {
    $js = array_splice($parents, $depth, count($parents), array($i));
    foreach (array_reverse($js) as $j) {
        $sides[$j]['right'] = ++$s;
    }
    $sides[$i]['left'] = ++$s;
    $i++;
}
foreach (array_reverse($parents) as $j) {
    $sides[$j]['right'] = ++$s;
}

Это, по упрощенной версии моего фактического кода, поскольку это просто хранит значения "стороны" в отдельном массиве, но это демонстрирует принцип.

Основная идея состоит в том, что Вы храните все родительские узлы (прослеженный значением глубины) в массиве и только пишете "левые" значения в Вашем цикле. Затем когда глубина уменьшается, это означает, что Вы возвратились иерархия, таким образом, родительский массив соединен для удаления тех, которые больше не релевантны, и они циклично выполняются, (наоборот) устанавливая "правильные" значения. Наконец, необходимо циклично выполниться по остающимся родителям в конце.

4
ответ дан 15 December 2019 в 01:12
поделиться

Не возможно решить эту проблему без рекурсии. Вам нужно что-то как следующее:

function tag_recursive($node, &$number) {
    $node->left = $number++;
    foreach ($node->children as &$child) {
        tag_recursive($child, $number);
    }
    $node->right = $number++;
}

function tag($node) {
    $number = 1;
    tag_recursive($node, $number);
    // $number is now highest id + 1
}
0
ответ дан 15 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: