Всем привет. Есть массив с определенными категориями, как их можно сложить в массив согласно каталогу?
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]
о не понял в коде, я его использовал и под свой массив, но не вышло. Спасибо!
А!!! Понял что не правильно понял задачу, но несколько раз перечитав, в итоге задачу так и не понял… Дайте задачу, не вырывая ее из контекста, то есть например порядок действий которые делаете сейчас, и что хотите изменить
Нужно упорядочить категории согласно их расположению в каталоге
Это структура категорий в каталоге
Категория Мебель
Подкатегория в категории Мебель - Кровати
Категория Игрушки
Подкатегория в категории Игрушки - Конструктор
Категория Спорт
Подкатегория в категории Спорт - Велосипеды
Массив категорий, где все неотсортированные по древу категорий категории ()
Подкатегория в категории Спорт - Велосипеды
Подкатегория в категории Мебель - Кровати
Подкатегория в категории Игрушки - Конструктор
Соответственно как то нужно их преобразовать обратно в вид
Категория Мебель
Подкатегория в категории Мебель - Кровати
Категория Игрушки
Подкатегория в категории Игрушки - Конструктор
Категория Спорт
Подкатегория в категории Спорт - Велосипеды
То есть вам не надо трогать дерево категорий. У вас есть СПИСОК из строк (я увидел именно список) в котором из нечетной строки надо получить название родительской категории, четная строка - название подкатегории, и преобразовать в текстовый файл как указано выше?
Да, не надо. Нужно отсортировать список категорий, чтобы были родительские и их подкатегории
все равно не пойму, это простой текстовый файл, или где у вас такой список? Или карточки на столе разложили, с названиями, и их надо поставитькак надо? вы так задачу и не дали полностью
1 лайк
Если массив берется стандартными средствами CS-Cart, то там есть параметры level и category_path - по ним можно добавить условие
Если есть доступ к участку кода, где вызывается fn_get_categories, там можно передать доп. параметр и функция вернет массив в нужном вам формате
1 лайк