Показать сообщение отдельно
  #1 (permalink)  
Старый 21.12.2017, 00:21
Профессор
Отправить личное сообщение для DivMan Посмотреть профиль Найти все сообщения от DivMan
 
Регистрация: 08.03.2016
Сообщений: 429

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

Убил 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>';


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

Ответить с цитированием