За последние 24 часа нас посетили 17477 программистов и 1714 роботов. Сейчас ищут 1612 программистов ...

Вывод категорий и подкатегорий

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 19 дек 2017.

  1. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    А и хрен с ними :)
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Вполне. Красивые картинки в наличии, SQL-запросы на все случаи жизни тоже
     
  3. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Чуть поигрался, сформировал разметку. Готовое решение, для тех кто хочет сделать небольшое многоуровневое меню.

    У фела

    PHP:
    1. $tree = [
    2.     ['name' => 'Уровень 1',     'id' => 1,  'pid' => 0],
    3.     ['name' => 'Уровень 1.1',   'id' => 2,  'pid' => 1],
    4.     ['name' => 'Уровень 1.2',   'id' => 3,  'pid' => 1],
    5.     ['name' => 'Уровень 1.3',   'id' => 4,  'pid' => 1],
    6.     ['name' => 'Уровень 2',     'id' => 5,  'pid' => 0],
    7.     ['name' => 'Уровень 2.1',   'id' => 6,  'pid' => 5],
    8.     ['name' => 'Уровень 2.2',   'id' => 7,  'pid' => 5],
    9.     ['name' => 'Уровень 3',     'id' => 8,  'pid' => 0],
    10.     ['name' => 'Уровень 3.1',   'id' => 9,  'pid' => 8],
    11.     ['name' => 'Уровень 3.1.1', 'id' => 10, 'pid' => 9],
    12.     ['name' => 'Уровень 3.1.2', 'id' => 11, 'pid' => 9],
    13.     ['name' => 'Уровень 1.4', 'id' => 12, 'pid' => 1],
    14.     ['name' => 'Уровень 2.3',   'id' => 13,  'pid' => 5],
    15.     ['name' => 'Уровень 3.1.2.1', 'id' => 14, 'pid' => 11],
    16.     ['name' => 'Уровень 1.4.1', 'id' => 15, 'pid' => 12],
    17. ];
    18.  
    19.  
    20. function rebuildTree($tree){
    21.     foreach ($tree as $key=>$node){
    22.         $ref = &$tree[$key];
    23.         $branches[$node['id']] = &$ref;  
    24.         $branches[$node['pid']]['chld'][] = &$ref;  
    25.         if ($node['pid'] === 0){
    26.             $result[] = &$ref;
    27.         }
    28.     }
    29.     return $result;
    30. }
    31. echo '<pre>';
    32. print_r(rebuildTree($tree));
    33. echo '</pre>';

    Моё

    PHP:
    1. /*
    2.   * Функция ищет вложенные массивы
    3.   * Можно использовать в виде
    4.   */
    5.  
    6. function child($ch){
    7.     echo '<ul>';
    8.     foreach($ch as $item){
    9.          echo '<li>'. $item['name'] . '</li>';
    10.         if(array_key_exists('chld', $item)){
    11.             child($item['chld']);
    12.         }
    13.     }
    14.     echo '</ul>';
    15. }
    16.  
    17. //Выводит самые главные категории
    18. echo '<ul>';
    19. foreach(rebuildTree($tree) as $category){
    20.     echo '<li>' . $category['name'] .  '</li>';
    21.     child($category['chld']);
    22. }
    23. echo '</ul>';
    --- Добавлено ---
    • Уровень 1
      • Уровень 1.1
      • Уровень 1.2
      • Уровень 1.3
      • Уровень 1.4
        • Уровень 1.4.1
    • Уровень 2
      • Уровень 2.1
      • Уровень 2.2
      • Уровень 2.3
    • Уровень 3
      • Уровень 3.1
        • Уровень 3.1.1
        • Уровень 3.1.2
          • Уровень 3.1.2.1
     
    #53 Dimon2x, 2 сен 2022
    Последнее редактирование: 2 сен 2022
  4. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Вот так без рекурсии

    PHP:
    1. <?php
    2.  
    3.  
    4. $tree = [
    5.    ['name' => 'Уровень 1',     'id' => 1,  'pid' => 0],
    6.     ['name' => 'Уровень 1.1',   'id' => 2,  'pid' => 1],
    7.     ['name' => 'Уровень 1.2',   'id' => 3,  'pid' => 1],
    8.     ['name' => 'Уровень 1.3',   'id' => 4,  'pid' => 1],
    9.     ['name' => 'Уровень 2',     'id' => 5,  'pid' => 0],
    10.     ['name' => 'Уровень 2.1',   'id' => 6,  'pid' => 5],
    11.     ['name' => 'Уровень 2.2',   'id' => 7,  'pid' => 5],
    12.     ['name' => 'Уровень 3',     'id' => 8,  'pid' => 0],
    13.     ['name' => 'Уровень 3.1',   'id' => 9,  'pid' => 8],
    14.     ['name' => 'Уровень 3.1.1', 'id' => 10, 'pid' => 9],
    15.     ['name' => 'Уровень 3.1.2', 'id' => 11, 'pid' => 9],
    16.     ['name' => 'Уровень 1.4', 'id' => 12, 'pid' => 1],
    17.     ['name' => 'Уровень 2.3',   'id' => 13,  'pid' => 5],
    18.     ['name' => 'Уровень 3.1.2.1', 'id' => 14, 'pid' => 11],
    19.     ['name' => 'Уровень 1.4.1', 'id' => 15, 'pid' => 12],
    20. ];
    21.  
    22.  
    23. function rebuildTree($tree){
    24.     foreach ($tree as $key => $node) {
    25.         $branches[$node['id']] = $node;
    26.     }
    27.     $rootNodes = [];
    28.     foreach ($tree as $node) {
    29.         if ($node['pid'] === 0) {
    30.             $rootNodes[] = &$branches[$node['id']];
    31.         } else {
    32.             $branches[$node['pid']]['chld'][] = &$branches[$node['id']];
    33.         }
    34.     }
    35.     return $rootNodes;
    36. }
    37.  
    38. $constructedTree = rebuildTree($tree);
    39.  
    40.  
    41.  
    42. function printTree($tree) {
    43.     $stack = array();
    44.     array_push($stack, array($tree, 0));
    45.  
    46.     while (count($stack) > 0) {
    47.         list($node, $level) = array_pop($stack);
    48.         echo str_repeat('----', $level) . $node['name'] . "\n";
    49.         if (isset($node['chld'])) {
    50.             $level++;
    51.             foreach (array_reverse($node['chld']) as $child) {
    52.                 array_push($stack, array($child, $level));
    53.             }
    54.         }
    55.     }
    56. }
    57.  
    58. foreach($constructedTree as $comment){
    59.     printTree($comment);
    60. }
     
  5. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Вот ещё варианты функции printTree

    PHP:
    1. function printTree($tree)
    2. {
    3.     $stack = [];
    4.     $subTree = &$tree;  // the considered branch
    5.     $ind = 0;
    6.  
    7.     // we test if we have more elements in the current branch or if we have an upper branch to process
    8.     while (($into = ($ind < count($subTree)))  ||  count($stack))
    9.     {
    10.         if (!$into)  // if all elements of current branch are processed, we restore the upper branch
    11.         {
    12.             [$subTree, $ind] = array_pop($stack);
    13.         }
    14.         else
    15.         {
    16.             // let's print the string, the indentation is calculated by the stack level
    17.             echo str_repeat(' ', (count($stack) + 1) * 2), $subTree[$ind]['name'],  PHP_EOL;
    18.  
    19.             // if there's a child branch we save the current processing branch and position
    20.             // and we prepare to process the sub-branch
    21.             if ($subTree[$ind]['chld'] ?? false)
    22.             {
    23.                 $stack[] = [&$subTree, $ind];
    24.                 $subTree = &$subTree[$ind]['chld'];
    25.                 $ind = -1;  // will become 0 in the next instruction ~ if you don't like it use: $ind = 0; continue;
    26.             }
    27.         }
    28.  
    29.         $ind++;
    30.     }
    31. }

    PHP:
    1. function printTree($tree)
    2. {
    3.     $stack = [];
    4.     foreach ($tree as $node) {
    5.         if (empty($node['pid'])) {
    6.             $stack[] = [$node, 0];
    7.         }
    8.     }
    9.  
    10.     // add this line:
    11.     $stack = array_reverse($stack);
    12.  
    13.     while (!empty($stack)) {
    14.  
    15.         list($node, $depth) = array_pop($stack);
    16.  
    17.         echo str_repeat('  ', $depth) . $node['name'] . PHP_EOL;
    18.  
    19.         if (isset($node['chld'])) {
    20.             foreach (array_reverse($node['chld']) as $child) {
    21.                 $stack[] = [$child, $depth + 1];
    22.             }
    23.         }
    24.     }
    25. }
     
    #55 Dimon2x, 23 апр 2023
    Последнее редактирование: 23 апр 2023