Список смежности и модель вложенного набора

Я изучал список смежности и модель вложенного набора, чтобы найти оптимальное древовидное решение.

Вплоть до этого момента. Теперь я подумал, что одним из основных преимуществ модели вложенного набора является то, что я могу использовать один SQL-запрос и некоторый код для получения полного дерева. Но обновлять / вставлять узлы сложно, и все дерево легко может быть повреждено.

Затем я наткнулся на эти два сообщения:

Рекурсивные категории с одним запросом?

http: //www.sitepoint. ru / форумы / showthread. php? t = 570360

Следующий код позволяет мне использовать список смежности с одним запросом SQL. Мне кажется, что список смежности легче обновлять и с меньшей вероятностью повредит все дерево.

Что вы думаете об этом коде?

Сгенерируйте многомерный массив, отражающий древовидную структуру

    $nodeList = array();
    $tree = array();

    $query = mysql_query("SELECT id, title, page_parent FROM categories ORDER BY page_parent");
    while($row = mysql_fetch_assoc($query)){
        $nodeList[$row['id']] = array_merge($row, array('children' => array()));
    }
    mysql_free_result($query);

    foreach($query AS $row){
        $nodeList[$row['id']] = array_merge($row, array('children' => array()));
    }

    foreach ($nodeList as $nodeId => &$node) {
        if (!$node['page_parent'] || !array_key_exists($node['page_parent'], $nodeList)) {
            $tree[] = &$node;
        } else {
            $nodeList[$node['page_parent']]['children'][] = &$node;
        }
    }

    unset($node);
    unset($nodeList);

Подготовьте неупорядоченный список с вложенными узлами

function printMenu ($arrTreeToTraverse, $ext = '.html', $breadcrumb = '') {

// Pre loop stuff
echo "
    \r\n"; foreach ($arrTreeToTraverse as $objItem) { // Stuff relevant to the item, before looping over its children if ($objItem['page_parent'] != 0) { $breadcrumb .= '/'.$objItem['uri']; } else { $breadcrumb .= $objItem['uri']; } if ($objItem['uri'] == 'index') { echo '
  • '.$objItem['title'].''; } else { echo '
  • '.$objItem['title'].''; } if ($objItem['children']) { echo "\r\n"; // Call the function again on the children printMenu($objItem['children'], $ext, $breadcrumb); }// if // Extend breadcrumb if it is a child or // reset breadcrumb if first level of tree $parent = explode('/', $breadcrumb); if ($objItem['page_parent'] != 0) { $breadcrumb = $parent[0]; } else { $breadcrumb = ''; } echo "
  • \r\n"; }// foreach // Post loop stuff echo "
\r\n"; }// function printMenu($navigation, '.html');

6
задан Community 23 May 2017 в 12:29
поделиться