Вы можете выбрать все категории сразу.
Предположим, у вас есть плоский результат из базы данных, например:
$categories = array(
array('id' => 1, 'parent' => 0, 'name' => 'Category A'),
array('id' => 2, 'parent' => 0, 'name' => 'Category B'),
array('id' => 3, 'parent' => 0, 'name' => 'Category C'),
array('id' => 4, 'parent' => 0, 'name' => 'Category D'),
array('id' => 5, 'parent' => 0, 'name' => 'Category E'),
array('id' => 6, 'parent' => 2, 'name' => 'Subcategory F'),
array('id' => 7, 'parent' => 2, 'name' => 'Subcategory G'),
array('id' => 8, 'parent' => 3, 'name' => 'Subcategory H'),
array('id' => 9, 'parent' => 4, 'name' => 'Subcategory I'),
array('id' => 10, 'parent' => 9, 'name' => 'Subcategory J'),
);
Вы можете создать простую функцию, которая превращает этот плоский списокв структуру, предпочтительно внутри функции.Я использую передачу по ссылке, чтобы в каждой категории был только один массив, а не несколько копий массива для одной категории.
function categoriesToTree(&$categories) {
Карта используется для быстрого поиска категорий.Здесь я также создал фиктивный массив для «корневого» уровня.
$map = array(
0 => array('subcategories' => array())
);
Я добавил другое поле, подкатегории, к каждому массиву категорий и добавил его на карту.
foreach ($categories as &$category) {
$category['subcategories'] = array();
$map[$category['id']] = &$category;
}
Повторно просматривая каждую категорию, добавляя себя в список подкатегорий своего родителя. Ссылка здесь важна, в противном случае уже добавленные категории не будут обновляться при наличии большего количества подкатегорий.
foreach ($categories as &$category) {
$map[$category['parent']]['subcategories'][] = &$category;
}
Наконец, верните подкатегории этой фиктивной категории, которые ссылаются на все категории верхнего уровня ._
return $map[0]['subcategories'];
}
Использование:
$tree = categoriesToTree($categories);
А вот код в действии на Кодовая панель .