трёхуровневое меню

154
22 декабря 2017, 02:45

Надо у подкатегории вывести подкатегорию.

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

Такой код допускается на проекте? Какой способ ещё есть?

Делаю запрос

SELECT
    category.id AS catId, category.name AS catName,
    sub_category.id AS subCatId, sub_category.name AS subCatName,
    page.id AS pageId, page.name AS pageName
FROM category LEFT JOIN sub_category
ON sub_category.category_id = category.id LEFT JOIN page
ON page.sub_category_id = sub_category.id ORDER BY category.id

Мне присылается вот такой массив

$res = [
        ['catId' => 1, 'catName' => 'Программы', 'subCatId' => 1, 'subCatName' => "Антивирусы", 'pageId' => "1", 'pageName' => "Касперский"],
        ['catId' => 1, 'catName' => 'Программы', 'subCatId' => 4, 'subCatName' => "Аудио", 'pageId' => "4", 'pageName' => "VirtualDJ"],
        ['catId' => 1, 'catName' => 'Программы', 'subCatId' => 4, 'subCatName' => "Аудио", 'pageId' => "5", 'pageName' => "FL Studio"],
        ['catId' => 1, 'catName' => 'Программы', 'subCatId' => 1, 'subCatName' => "Антивирусы", 'pageId' => "6", 'pageName' => "NOD32"],
        ['catId' => 1, 'catName' => 'Программы', 'subCatId' => 2, 'subCatName' => "Запись", 'pageId' => "NULL", 'pageName' => "NULL"],
        ['catId' => 1, 'catName' => 'Программы', 'subCatId' => 3, 'subCatName' => "Интернет", 'pageId' => "NULL", 'pageName' => "NULL"],
        ['catId' => 2, 'catName' => 'Фильмы',    'subCatId' => 5, 'subCatName' => "Боевики", 'pageId' => "2", 'pageName' => "Джпеки Чан"],
        ['catId' => 2, 'catName' => 'Фильмы',    'subCatId' => 7, 'subCatName' => "Ужастики", 'pageId' => "3", 'pageName' => "Псы войны"],
        ['catId' => 2, 'catName' => 'Фильмы',    'subCatId' => 5, 'subCatName' => "Боевики", 'pageId' => "8", 'pageName' => "Американский ниндзя"],
        ['catId' => 2, 'catName' => 'Фильмы',    'subCatId' => 6, 'subCatName' => "Фантастика", 'pageId' => "NULL", 'pageName' => "NULL"],
    ];

Потом я из него делаю другой массив, который мне нужен. Вот так я его делаю

$mass = [];
foreach($res as $cat) {
    if (!array_key_exists($cat['catName'] . '|' . $cat['catId'], $mass)) {
        $mass[$cat['catName'] . '|' . $cat['catId']] = [$cat['subCatName'] . '|' . $cat['subCatId']=> [$cat['pageId']=>$cat['pageName']]];
    }
    else {
        $mass[$cat['catName']. '|' .$cat['catId']][$cat['subCatName'] . '|' .$cat['subCatId']][$cat['pageId']]=$cat['pageName'];
    }
}

После этого получился вот такой массив

Array
(
    [Программы|1] => Array
        (
            [Антивирусы|1] => Array
                (
                    [1] => Касперский
                    [6] => NOD32
                )
            [Аудио|4] => Array
                (
                    [4] => VirtualDJ
                    [5] => FL Studio
                )
            [Запись|2] => Array
                (
                    [] =>
                )
            [Интернет|3] => Array
                (
                    [] =>
                )
        )
    [Фильмы|2] => Array
        (
            [Боевики|5] => Array
                (
                    [2] => Джеки Чан
                    [8] => Американский ниндзя
                )
            [Ужастики|7] => Array
                (
                    [3] => Псы войны
                )
            [Фантастика|6] => Array
                (
                    [] =>
                )
        )
)

И потом уже, создаю списки

echo '<ul>';
foreach($mass as $key => $val) {
    $category = explode('|', $key);
    echo '<li><a href="/category/'.$category[1].'">'.$category[0].'</a>';
         foreach($val as $k => $v) {
            $subCategory = explode('|', $k);
                echo '<ul>';
                    echo '<li><a href="/sub-category/'.$subCategory[1].'">'.$subCategory[0].'</a>';
                         foreach($v as $postKey => $postVal) {
                            echo '<ul>';
                                echo '<li><a href="/post/'.$postKey.'">'.$postVal.'</a></li>';
                            echo '</ul>';
                         }
                    echo '</li>';
                echo '</ul>';
         }
    echo '</li>';
}
echo '</ul>';

Получается вот такое

READ ALSO
Парсинг страницы в обход CloudFlare

Парсинг страницы в обход CloudFlare

Пытаюсь спарсить страницу сайта в обход CloudFlare, раньше на других сайтах выходило, но теперь при обращении к разделу /cdn-cgi/l/chk_jschl, не отдаются...

642
Как склеить 3 картинки в 1 на php

Как склеить 3 картинки в 1 на php

Задача есть 3 изображения:

203
Как вывести данные таблицы

Как вывести данные таблицы

Есть таблица отпусков, там есть поле видПо виду отпуска я вытаскиваю все данные

172