Создайте дерево списка с массивом - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу создать дерево с элементами html "ul" и "li".Я хочу, чтобы конечный результат выглядел примерно так.

My List
    Menu 1
        Menu 2
            Menu 3
        Menu 4
    Menu 5

Но когда я запускаю свой код, результат выглядит примерно так:

My List
    Menu 1

Вот мой код массива PHP:

$lists = array(array(
    array(
        'id' => 1,
        'parent' => 0,
        'name' => 'Menu 1',
    ),
    array(
        'id' => 2,
        'parent' => 1,
        'name' => 'Menu 2',
    ),
    array(
        'id' => 3,
        'parent' => 2,
        'name' => 'Menu 3',
    ),
    array(
        'id' => 4,
        'parent' => 1,
        'name' => 'Menu 4',
    ),
    array(
        'id' => 4,
        'parent' => 0,
        'name' => 'Menu 5',
    )
));
?>
<ul>
<li><a>My List</a>
    <ul>
        <?php
        foreach($lists as $key=>$list) {
            ?>
            <li><a><?= $list[$key]['name']; ?></a></li>
            <?php
        }
        ?>
    </ul>
</li>
</ul>

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вам действительно нужна рекурсивная функция для построения этого дерева.Вот тот, который будет делать то, что вы хотите.Обратите внимание, что он учитывает дополнительный (ненужный?) Слой массива, который у вас есть во входных данных, если он на самом деле не существует, удалите [0] из ссылки на $lists в функции:

function make_list($lists, $parent = 0) {
    $children = array_filter($lists[0], function ($v) use($parent) { return $v['parent'] == $parent; });
    if (!count($children)) return;
    echo "<ul>\n";
    foreach ($children as $child) {
        echo "<li>{$child['name']}</li>\n";
        make_list($lists, $child['id']);
    }
    echo "</ul>\n";
}

make_list($lists);

Вывод:

<ul>
  <li>Menu 1</li>
  <ul>
    <li>Menu 2</li>
    <ul>
      <li>Menu 3</li>
    </ul>
    <li>Menu 4</li>
  </ul>
  <li>Menu 5</li>
</ul>

Демонстрация на 3v4l.org

0 голосов
/ 27 февраля 2019

У вас все еще есть кое-что, что нужно сделать для родительского / дочернего элемента, но чтобы заставить его работать изначально, просто разверните массив с помощью дополнительного array() и получите доступ к элементу на основе без $key, например, так:

$lists = array(
    array(
        'id' => 1,
        'parent' => 0,
        'name' => 'Menu 1',
    ),
    array(
        'id' => 2,
        'parent' => 1,
        'name' => 'Menu 2',
    ),
    array(
        'id' => 3,
        'parent' => 2,
        'name' => 'Menu 3',
    ),
    array(
        'id' => 4,
        'parent' => 1,
        'name' => 'Menu 4',
    ),
    array(
        'id' => 4,
        'parent' => 0,
        'name' => 'Menu 5',
    )
);
?>
<ul>
<li><a>My List</a>
    <ul>
        <?php
        foreach($lists as $key=>$list) {
            ?>
            <li><a><?= $list['name']; ?></a></li>
            <?php
        }
        ?>
    </ul>
</li>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...