[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Категории-подкатегории - формирование массива
Lutsk
Распространенная задача (Джумла).
Допустим есть таблица категорий, в которой у категорий конечно же есть подкатегории и есть поле `parentid` (значение у родительской '0').
Причем порядок категорий в таблице разбросан, - есть только поле сортировки 'ordering', согласно которому делается выборка.
И есть задача для вывода списка категорий на страницу - сформировать многомерный массив с вложенностью категорий.

На ум пришла такая реализация. Сначала вытягиваем только родителей:
SELECT `id`, `name`, `parentid` FROM `categories` WHERE `parentid` = 0 ORDER BY `ordering`

Дальше обходим массив с родителями и в каждой итерации подгружаем дочерние:
// Формирование запроса
$db = JFactory::getDbo();
$query = 'SELECT `id`, `name`, `parentid` FROM `categories` WHERE `parentid` = 0 ORDER BY `ordering`';
$db->setQuery($query);
$rows = $db->loadObjectList(); // Массив объектов родителей

$list = array();
foreach($rows as $row) {
$row->cilds = getCilds($row->id);
$list[] = $row;
}

// Выборка дочерних элементов
function getCilds($id) {
$db = JFactory::getDbo();
$query = 'SELECT `id`, `name`, `parentid` FROM `categories` WHERE `parentid` = '.$id;
$db->setQuery($query);
return $db->loadObjectList();
}

В итоге получаем такой массив:
Array
(
[0] => stdClass Object
(
[id] => 36
[name] => Категория 1
[parentid] => 0
[cilds] => Array
(
[0] => stdClass Object
(
[id] => 20
[name] => Подкатегория 1-2
[parentid] => 36
)

[1] => stdClass Object
(
[id] => 21
[name] => Подкатегория 1-1
[parentid] => 36
)

)

)

[1] => stdClass Object
(
[id] => 13
[name] => Категория 2
[parentid] => 0
[cilds] => Array
(
[0] => stdClass Object
(
[id] => 46
[name] => Подкатегория 2-1
[parentid] => 13
)

[1] => stdClass Object
(
[id] => 47
[name] => Подкатегория 2-2
[parentid] => 13
)

)

)
)

Правильно ли делать в каждой итерации цикла запрос к базе? Или есть другие методы формирования подобного массива?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.