PHP массив l oop для построения меню ul li - PullRequest
0 голосов
/ 27 марта 2020

У меня есть arraylist, и я хочу перечислить его как меню:

  • Если item['parent'] пусто, это будет родительский элемент.

  • Если item['parent'] равно item['id'], это будет подпункт к этому

Массив, который я хочу перечислить:

$arr = array(
    [
        "name"   => "cat1",
        "id"     => "1",
        "parent" => "",
    ],
    [
        "name"   => "cat2",
        "id"     => "2",
        "parent" => "",
    ],
    [
        "name"   => "subcat1",
        "id"     => "6",
        "parent" => "1",
    ],
    [
        "name"   => "subcat2",
        "id"     => "6",
        "parent" => "2",
    ],
);

и мой php код:

echo "<ul>";
foreach ($arr as $item) {
    if (!$item["parent"]) {
        $id = $item["id"];
        echo "<li>";
        echo $item["name"];
    }
    if ($item["parent"] == $id) {
        echo "<ul>";
        echo "<li>";
        echo $item["name"];
        echo "</li>";
        echo "</ul>";
    }
}
echo "</ul>";

1 Ответ

1 голос
/ 27 марта 2020

Предполагая, что ваше вложение имеет только один уровень глубины, вы можете использовать этот код, чтобы найти всех родителей, затем выполнить итерацию по ним и отобразить всех их дочерних элементов в качестве подсписка.

$parents = array_filter($arr, function ($item) { return !$item['parent'];});
echo "<ul>\n";
foreach ($parents as $parent) {
    echo "<li>{$parent['name']}</li>\n";
    // find the children
    $children = array_filter($arr, function ($item) use ($parent) { return $item['parent'] == $parent['id']; });
    if (!empty($children)) {
        echo "<ul>\n";
        foreach ($children as $child) {
            echo "<li>{$child['name']}</li>\n";
        }
        echo "</ul>\n";
    }
}
echo "</ul>\n";

Вывод (для ваши данные образца):

<ul>
<li>cat1</li>
<ul>
<li>subcat1</li>
</ul>
<li>cat2</li>
<ul>
<li>subcat2</li>
</ul>
</ul>

или как HTML:

  • cat1
  • subcat1
cat2
  • subcat2

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

Если вы можете иметь вложение глубже, чем на один уровень, вы нужно переписать приведенный выше код как рекурсивную функцию:

function list_item($arr, $item) {
    echo "<li>{$item['name']}</li>\n";
    // find any children
    $children = array_filter($arr, function ($i) use ($item) { return $i['parent'] == $item['id']; });
    if (!empty($children)) {
        echo "<ul>\n";
        foreach ($children as $child) {
            list_item($arr, $child);
        }
        echo "</ul>\n";
    }
}

$parents = array_filter($arr, function ($item) { return !$item['parent'];});
echo "<ul>\n";
foreach ($parents as $parent) {
    list_item($arr, $parent);
}
echo "</ul>\n";

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...