PHP - Как в отсортированных элементах массива вынести названия элементов
На Opencart 3 на странице корзины отображаются товары, которые туда поставил пользователь. Стоит задача отсортировать эти товары по производителю и вынести название производителя отдельно. Чтобы получились подгруппы. Выглядеть примерно должно так.
Название производителя 1
Товар 1
Товар 2
Товар 3
Название производителя 2
Товар 5
Товар 6
Товар 7
На данный момент с помощью usort удалось отсортировать все товары по производителям
usort($data['products'], function($a, $b) {
return $a['manufacturer'] <=> $b['manufacturer'];
});
В итоге получаю нужную сортировку. Массив приходит в том порядке, в котором нужно. Только как теперь название магазинов ['manufacturer'] выделить в отдельное название, чтобы получилось на примере как выше?
Array
(
[0] => Array
(
[cart_id] => 23
[thumb] => http://magis.loc/image/cache/catalog/Products/shoe3-90x90.jpg
[name] => Кроссовки мужские белые для повседневной носки
[model] =>
[upc] => 8
[manufacturer] => Bykilian
[manufacturers] => http://magis.loc/index.php?route=product/manufacturer/info&manufacturer_id=12
[option] => Array
(
)
[recurring] =>
[quantity] => 2
[stock] => 1
[reward] =>
[price] => 179.00 $
[total] => 358.00 $
[href] => http://magis.loc/index.php?route=product/product&product_id=52
)
[1] => Array
(
[cart_id] => 26
[thumb] => http://magis.loc/image/cache/catalog/Products/shoe4-90x90.jpg
[name] => Бутсы спортивные мужские
[model] => 36 - 1 шт
[upc] => 8
[manufacturer] => Bykilian
[manufacturers] => http://magis.loc/index.php?route=product/manufacturer/info&manufacturer_id=12
[option] => Array
(
)
[recurring] =>
[quantity] => 2
[stock] => 1
[reward] =>
[price] => 80.00 $
[total] => 160.00 $
[href] => http://magis.loc/index.php?route=product/product&product_id=53
)
[2] => Array
(
[cart_id] => 29
[thumb] => http://magis.loc/image/cache/catalog/Products/shoe5-90x90.jpg
[name] => Кроссовки мужские для повседневной носки
[model] =>
[upc] => 8
[manufacturer] => Kidsnail
[manufacturers] => http://magis.loc/index.php?route=product/manufacturer/info&manufacturer_id=13
[option] => Array
(
)
[recurring] =>
[quantity] => 2
[stock] => 1
[reward] =>
[price] => 194.00 $
[total] => 388.00 $
[href] => http://magis.loc/index.php?route=product/product&product_id=54
)
[3] => Array
(
[cart_id] => 24
[thumb] => http://magis.loc/image/cache/catalog/Products/shoe7-90x90.jpg
[name] => Туфли женские открытые
[model] =>
[upc] => 8
[manufacturer] => Longstormaier
[manufacturers] => http://magis.loc/index.php?route=product/manufacturer/info&manufacturer_id=11
[option] => Array
(
)
[recurring] =>
[quantity] => 4
[stock] => 1
[reward] =>
[price] => 199.00 $
[total] => 796.00 $
[href] => http://magis.loc/index.php?route=product/product&product_id=56
)
[4] => Array
(
[cart_id] => 25
[thumb] =>
[name] => Туфли женские на каблуке
[model] =>
[upc] => 6
[manufacturer] => Longstormaier
[manufacturers] => http://magis.loc/index.php?route=product/manufacturer/info&manufacturer_id=11
[option] => Array
(
)
[recurring] =>
[quantity] => 3
[stock] => 1
[reward] =>
[price] => 150.00 $
[total] => 450.00 $
[href] => http://magis.loc/index.php?route=product/product&product_id=51
)
)
Так выглядит функция по умолчанию, которая выводит массив
foreach ($products as $product) {
$product_info = $this->model_catalog_product->getProduct($product['product_id']);
$product_total = 0;
$data['products'][] = array(
'cart_id' => $product['cart_id'],
'thumb' => $image,
'name' => $product['name'],
'model' => $product['model'],
'upc' => $product_info['upc'],
'manufacturer' => $product_info['manufacturer'],
'manufacturers' => $this->url->link('product/manufacturer/info', 'manufacturer_id=' . $product_info['manufacturer_id']),
'option' => $option_data,
'recurring' => $recurring,
'quantity' => $product['quantity'],
'stock' => $product['stock'] ? true : !(!$this->config->get('config_stock_checkout') || $this->config->get('config_stock_warning')),
'reward' => ($product['reward'] ? sprintf($this->language->get('text_points'), $product['reward']) : ''),
'price' => $price,
'total' => $total,
'href' => $this->url->link('product/product', 'product_id=' . $product['product_id'])
);
}
Ответы (2 шт):
Перестройте массив
$res = [];
foreach ($data['products'] as $x) {
$res[$x['manufacturer']][] = $x;
}
foreach ($res as $k=>$v) {
// $k - производитель
foreach ($v as $x) {
// $x - товар
}
}
<?php
$products = [
['manufacturer' => 'Nike', 'name' => 'Кроссовки мужские'],
['manufacturer' => 'Nike', 'name' => 'Кроссовки женские'],
['manufacturer' => 'Puma', 'name' => 'Штаны мужские'],
['manufacturer' => 'Puma', 'name' => 'Штаны женские'],
];
$manufacturerToProducts = [];
foreach ($products as $product) {
$manufacturer = $product['manufacturer'];
$manufacturerToProducts[$manufacturer][] = $product;
}
foreach ($manufacturerToProducts as $manufacturer => $products) {
echo "\n{$manufacturer}:\n";
foreach ($products as $product) {
echo "\t{$product['name']}\n";
}
}
Этот скрипт выведет:
Nike:
Кроссовки мужские
Кроссовки женские
Puma:
Штаны мужские
Штаны женские
Даже не обязательно, чтобы массив $products был отсортированным.