Прежде всего, я хотел бы отметить, что категории и подкатегории должны находиться в одной таблице БД, а подкатегории должны быть помечены полем (например, subcategory_of) и должны быть связаны с идентификатором категории.Таким образом, у нас нет путаницы идентификаторов, потому что продукты могут быть в обеих категориях ИЛИ подкатегориях.
Инициализировать общий массив, который будет идти $array['category']['subcategory']['product_id']
, или в некоторых случаях продукты могут непосредственно находиться вкатегория без классификации подкатегории. Вам не нужно этого делать, вы можете просто распечатать выходные данные, не сохраняя их в массиве.
Запускать их, начиная с категорий, для каждой категории:
- Проверьте, есть ли у категории подкатегории, если она есть, получите продукты в этой подкатегории.
- Проверьте, есть ли какие-либо продукты в этой категории.
Так что у вас будетбудет выглядеть примерно так:
$cat = 0;
$categories = getCategories();
foreach ($categories as $category) {
// If you want to print something about the category, do it here.
$subcategories = getSubcategories($category_id);
$subcat = 0;
foreach ($subcategories as $subcategory) {
$products = getProducts($category_id_for_subcategory) // see note 1
foreach ($products as $product) {
// This product is under a subcategory. Do what you want here.
$array[$cat][$subcat++][] = $product; // or echo the product...
}
}
$products = getProducts($category_id);
foreach ($products as $product) {
// This product is under a general category, and not a subcategory.
// Do what you want to do with this product here.
$array[$cat++][] = $product; // or echo the product.
}
}
Примечание 1: Каждая подкатегория также считается категорией, поэтому здесь мы будем использовать идентификаторы категорий подкатегорий.Однако, когда мы получаем подкатегории в массив, мы должны получать только те, которые связаны с $category_id
, предоставленным в параметре метода getSubcategories
.И эти «методы get» должны возвращать массивы, чтобы мы могли проходить через них.
Примечание 2: Я знаю, что это потенциально опасный способ написания этого кода, так как мызапрашиваем базу данных каждый раз, когда мы выполняем итерацию в цикле foreach.И, как сказал Марк, это может быть очень неэффективно, если у вас много категорий и продуктов.Причина, по которой я написал это так, заключается в том, что он многословен и позволяет новому программисту понять идею, лежащую в основе того, что мы делаем, (по крайней мере, мне стало легче ее понимать).
Iнадеюсь, это прояснит вам все.