Выполните повторение через многомерный массив PHP для создания списка HTML

0

К сожалению, я борюсь со всем, где рекурсия, и эта проблема ничем не отличается.

У меня есть структура категории в массиве PHP. Я сгруппировал его по таким родительским категориям, но если это оправдано, я был бы рад изменить это:

array(5) {
  [0] => array(4) {
    [50] => array(5) {
      ["category_id"] => int(50)
      ["category_title"] => string(29) "Category 50"
      ["parent_category_id"] => int(0)
      ["display_order"] => int(0)
      ["depth"] => int(0)
    }
    [1] => array(5) {
      ["category_id"] => int(1)
      ["category_title"] => string(24) "Category 1"
      ["parent_category_id"] => int(0)
      ["display_order"] => int(1)
      ["depth"] => int(0)
    }
    [80] => array(5) {
      ["category_id"] => int(80)
      ["category_title"] => string(27) "Category 80"
      ["parent_category_id"] => int(0)
      ["display_order"] => int(1)
      ["depth"] => int(0)
    }
    [10] => array(5) {
      ["category_id"] => int(10)
      ["category_title"] => string(29) "Category 10"
      ["parent_category_id"] => int(0)
      ["display_order"] => int(10)
      ["depth"] => int(0)
    }
  }
  [1] => array(1) {
    [2] => array(5) {
      ["category_id"] => int(2)
      ["category_title"] => string(21) "Category 2"
      ["parent_category_id"] => int(1)
      ["display_order"] => int(1)
      ["depth"] => int(1)
    }
  }
  [30] => array(1) {
    [90] => array(5) {
      ["category_id"] => int(90)
      ["category_title"] => string(11) "Category 90"
      ["parent_category_id"] => int(30)
      ["display_order"] => int(1)
      ["depth"] => int(2)
    }
  }
  [10] => array(2) {
    [20] => array(5) {
      ["category_id"] => int(20)
      ["category_title"] => string(21) "Category 20"
      ["parent_category_id"] => int(10)
      ["display_order"] => int(10)
      ["depth"] => int(1)
    }
    [30] => array(5) {
      ["category_id"] => int(30)
      ["category_title"] => string(17) "Category 30"
      ["parent_category_id"] => int(10)
      ["display_order"] => int(20)
      ["depth"] => int(1)
    }
  }
  [50] => array(3) {
    [40] => array(5) {
      ["category_id"] => int(40)
      ["category_title"] => string(6) "Category 40"
      ["parent_category_id"] => int(50)
      ["display_order"] => int(1000)
      ["depth"] => int(1)
    }
    [60] => array(5) {
      ["category_id"] => int(60)
      ["category_title"] => string(6) "Category 60"
      ["parent_category_id"] => int(50)
      ["display_order"] => int(2000)
      ["depth"] => int(1)
    }
    [70] => array(5) {
      ["category_id"] => int(70)
      ["category_title"] => string(17) "Category 70"
      ["parent_category_id"] => int(50)
      ["display_order"] => int(3000)
      ["depth"] => int(1)
    }
}

Итак, конечный результат HTML должен выглядеть так:

<ul>
    <li>Category 50</li>
    <ul>
        <li>Category 40</li>
        <li>Category 60</li>
        <li>Category 70</li>
    </ul>
    <li>Category 1</li>
    <ul>
        <li>Category 2</li>
    </ul>
    <li>Category 80</li>
    <li>Category 10</li>
    <ul>
        <li>Category 20</li>
        <li>Category 30</li>
        <ul>
            <li>Category 90</li>
        </ul>
    </ul>
</ul>

Обратите внимание, что может быть несколько уровней вложенности.

Хотя это не показано в приведенном выше примере, было бы полезно использовать больше, чем просто "category_title" для каждого элемента списка (есть другие параметры, которые не показаны, например, счетчики и другие статистические данные, которые были удалены для простоты).

Я невероятно благодарен за то, что вы даже зачитали это далеко. Любые предложения с благодарностью получили.

Визуальное представление конечного результата HTML:

Я хочу преобразовать это в список HTML следующим образом:

  • Категория 50
    • Категория 40
    • Категория 60
    • Категория 70
  • Категория 1
    • Категория 2
  • Категория 80
  • Категория 10
    • Категория 20
    • Категория 30
      • Категория 90
Теги:
arrays
recursion

1 ответ

1

Это должно сработать. Обратите внимание, что это непроверенный скрипт:

function recursiveList($array) {
   echo '<ul>';
   foreach ($array as $key => $value) {
       if (is_array($value) && !isset($value['category_id'])) { // if isset fails means that there is an array containing other categories arrays
           recursiveList($value);
       }
       echo '<li>' . $value['category_title'] . '</li>';
   }
   echo '</ul>';
}

recursiveList($categories);
  • 0
    Спасибо за ваш ответ. Сейчас он работает не так, как ожидалось, но это может быть связано со способом построения массива (сгруппированным по родительским категориям). Я сделаю немного больше тестирования с этим. Спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню