Сгруппировать категории как в каталоге

Всем привет. Есть массив с определенными категориями, как их можно сложить в массив согласно каталогу?

1 массив

категория - мебель
категория - машина
категория - игрушка

2 массив разложенный

категория - мебель
подкатегория - машина (после определенных действий она должна уйти в подкатегорию так как в каталоге у нее родитель - категория мебель)
категория - игрушка

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

Стало интересно, переписал функцию

$arr_category = array();


function recursive_category($pid,&$arr) {
  
    $result = db_get_array("SELECT
                    cat1.category_id AS id,
                    cat2.category AS name,
                    SUBSTRING_INDEX(cat1.id_path, '/', 1) AS root_pid
                FROM
                    ?:categories AS cat1 INNER JOIN
                    ?:category_descriptions AS cat2
                    ON
                    cat1.category_id=cat2.category_id
                WHERE cat2.lang_code='ru' AND cat1.status='A'
                    AND cat1.parent_id = ".$pid."
            ");

    foreach ($result as $line) {

        $arr[$line['id']] = array();
        $arr[$line['id']]['name'] = $line['name'];

        recursive_category($line['id'],$arr[$line['id']]);
    }

}


recursive_category(0, $arr_category);

fn_print_r($arr_category);

вывод такой (кусок вывода привожу)

Array
(

    [36] => Array
        (
            [name] => Для дачи и сада
            [89] => Array
                (
                    [name] => Садовые фигурки
                )

            [246] => Array
                (
                    [name] => Подсвечники-фонари
                )

            [247] => Array
                (
                    [name] => Для цветов и растений
                    [312] => Array
                        (
                            [name] => Арки, опоры, шпалеры
                        )

                )

            [248] => Array
                (
                    [name] => Декор для сада
                )

            [249] => Array
                (
                    [name] => Садовая мебель
                    [300] => Array
                        (
                            [name] => Столы
                        )

                    [301] => Array
                        (
                            [name] => Скамейки
                        )

                    [302] => Array
                        (
                            [name] => Стулья
                        )

                    [304] => Array
                        (
                            [name] => Кресла
                        )

                    [311] => Array
                        (
                            [name] => Этажерки
                        )

                )

    [313] => Array
        (
            [name] => Техника для дома
        )

)

Summary

много расписывать не буду, вот у меня есть функция, которая распечатывает в файл xml категории с подкатегориями в нужном вам порядке. Вместо распечатки можете записывать значения в массив
$f - открытый на запись файл вне этой функции
$arr_category - внешний массив определенный вне функции для дальнейшей проверки по наличию в нем id
Общий принцип думаю понятен - рлдуччаем спсок категорий первого уровня, циклом проходя по ним для каждого рекурсивно вызываем саму себя итп далее обходя до конца каждую ветку дерева

/*############################################################################**
void recursive_category(int $pid)
Функция получает id раздела каталога и выводит упорядоченное дерево (ветку)
если pid = 0 - начинает от корня дерева категорий
Функция возвращает одномерный массив с перечнем id всех активных разделов.
------------------------------------------------------------------------------*/
function recursive_category($pid) {
  global $f, $arr_category;
    $result = db_get_array("SELECT
                    cat1.category_id AS id,
                    cat2.category AS name,
                    SUBSTRING_INDEX(cat1.id_path, '/', 1) AS root_pid
                FROM
                    ?:categories AS cat1 INNER JOIN
                    ?:category_descriptions AS cat2
                    ON
                    cat1.category_id=cat2.category_id
                WHERE cat2.lang_code='ru' AND cat1.status='A'
                    AND cat1.parent_id = ".$pid."
            ");
    if ($pid == 0) fwrite($f, chr(9).'<categories>'.chr(10));
    foreach ($result as $line) {
        $str = '<category id="'.$line['id'].'"';
        if ($pid > 0) $str .= ' parentId="'.$pid.'"';
        fwrite($f, chr(9).chr(9).$str.'>'.check_xml($line['name']).'</category>'.chr(10));
        $arr_category[] = $line['id'];
        recursive_category($line['id']);
    }
    if ($pid == 0) fwrite($f, chr(9).'</categories>'.chr(10));
}

Спасибо за помощь! Только не разобрался, функция раскладывает все категории которые есть в каталоге по иерархии, а как разложить определенный список категорий по иерархии каталога, чтобы они выстроились в правильную структуру? Возможно что-т[quote=“alex19946, post:1, topic:4873, full:true”]
Всем привет. Есть массив с определенными категориями, как их можно сложить в массив согласно каталогу?

1 массив

категория - мебель
категория - машина
категория - игрушка

2 массив разложенный

категория - мебель
подкатегория - машина (после определенных действий она должна уйти в подкатегорию так как в каталоге у нее родитель - категория мебель)
категория - игрушка

То есть разложить их по подкатегориям, иначе они все в один массив выводяться, заранее спасибо если кто уже реализовывал подобное!
[/quote]

о не понял в коде, я его использовал и под свой массив, но не вышло. Спасибо!

А!!! Понял что не правильно понял задачу, но несколько раз перечитав, в итоге задачу так и не понял… Дайте задачу, не вырывая ее из контекста, то есть например порядок действий которые делаете сейчас, и что хотите изменить :slight_smile:

Нужно упорядочить категории согласно их расположению в каталоге

Это структура категорий в каталоге

Категория Мебель
Подкатегория в категории Мебель - Кровати

Категория Игрушки
Подкатегория в категории Игрушки - Конструктор

Категория Спорт
Подкатегория в категории Спорт - Велосипеды

Массив категорий, где все неотсортированные по древу категорий категории ()

Подкатегория в категории Спорт - Велосипеды
Подкатегория в категории Мебель - Кровати
Подкатегория в категории Игрушки - Конструктор

Соответственно как то нужно их преобразовать обратно в вид

Категория Мебель
Подкатегория в категории Мебель - Кровати

Категория Игрушки
Подкатегория в категории Игрушки - Конструктор

Категория Спорт
Подкатегория в категории Спорт - Велосипеды

То есть вам не надо трогать дерево категорий. У вас есть СПИСОК из строк (я увидел именно список) в котором из нечетной строки надо получить название родительской категории, четная строка - название подкатегории, и преобразовать в текстовый файл как указано выше?

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

все равно не пойму, это простой текстовый файл, или где у вас такой список? Или карточки на столе разложили, с названиями, и их надо поставитькак надо? вы так задачу и не дали полностью

1 лайк

Если массив берется стандартными средствами CS-Cart, то там есть параметры level и category_path - по ним можно добавить условие

Если есть доступ к участку кода, где вызывается fn_get_categories, там можно передать доп. параметр и функция вернет массив в нужном вам формате

1 лайк

Спасибо за помощь.

Спасибо за помощь.

1 лайк