Всем привет! Есть массив, который приходит на view:
Array
(
[0] => Array
(
[name] => product_1
[model] => model_1
[option] => Array
(
[0] => Array
(
[product_id] => 47
[name] => Размер
[value] => 39
)
)
[quantity] => 10
)
[1] => Array
(
[name] => product_1
[model] => model_1
[option] => Array
(
[0] => Array
(
[product_id] => 47
[name] => Размер
[value] => 40
)
)
[quantity] => 20
)
[2] => Array
(
[name] => product_2
[model] => model_2
[option] => Array
(
[0] => Array
(
[product_id] => 55
[name] => Размер
[value] => 44
)
)
[quantity] => 30
)
)
и т.д.
Необходимо убрать дубли и перезаписать, чтоб имел такой вид:
Array
(
[0] => Array
(
[name] => product_1
[model] => model_1
[option] => Array
(
[0] => Array
(
[product_id] => 47
[name] => Размер
[value] => 39
)
[1] => Array
(
[product_id] => 47
[name] => Размер
[value] => 40
)
)
[quantity] => 10
),
[1] => Array
(
[name] => product_2
[model] => model_2
[option] => Array
(
[0] => Array
(
[product_id] => 55
[name] => Размер
[value] => 44
)
)
[quantity] => 30
)
Модель трогать нельзя. Сейчас делаю так:
$keys=array(); // Массив ключей, которые уже встречались
foreach($products as $k=>$val) {
if(array_key_exists($val['model'],$keys)) {
unset($products[$k]);
} else {
$keys[$val['model']]=1;
}
}
Сейчас убирает дубли, а как сделать чтоб еще дописывал из дублей [option]
?
Для конечного результата используйте новый массив. Хранить уже встретившиеся ключи смысла особо нет, надо "продукты" добавлять в результирующий массив с ключом - именем модели. Число товаров quantity
имеет смысл, наверное, добавлять в массив options
, т.к. в противном случае останется только значение из первого элемента, а вам скорее всего нужно знать сколько "обуви" и каких размеров в наличии.
В итоге алгоритм следующего вида. Если ключа имени-модели в результирующем массиве нет, то добавляем его, при этом quantity
переносим в options. Если есть, то добавляем элемент в options
, попутно перенося quantity
.
$result = [];
//итерируем исходные данные
foreach($model as $m){
//значение имение модели для сокращения
$mname = $m['model'];
// переносим quantity в option
$m['option'][0]['quantity'] = $m['quantity'] ;
// Модель уже присутствует в результатах?
if(isset($result[$mname])){
// добавляем текущий option к результирующему массиву
$result[$mname]['option'][] = $m['option'][0];
}
// модели в результатах нет.
else {
//убираем quantity, т.к. перенесли его в options
unset($m['quantity']);
// помещаем модель в результирующий массив
$result[$mname] = $m;
}
}
//если нужны целочисленные ключи массива
$result = array_values($result);
В коде подразумеваем, что обрабатываем некоторый результат джойна таблиц продуктов их их "вариантов", и в option
всегда находится ровно 1 элемент.
Результат выполнения имеет следующий вид:
[0] => Array
(
[name] => product_1
[model] => model_1
[option] => Array
(
[0] => Array
(
[product_id] => 47
[name] => Размер
[value] => 39
[quantity] => 10
)
[1] => Array
(
[product_id] => 47
[name] => Размер
[value] => 40
[quantity] => 20
)
)
)
[1] => Array
(
[name] => product_2
[model] => model_2
[option] => Array
(
[0] => Array
(
[product_id] => 47
[name] => Размер
[value] => 40
[quantity] => 20
)
)
)
(в исходный массив был добавлен product_2
для наглядности)
Вот рабочая версия:
$result = [];
foreach($products as $val){
$val['option'][0]['quantity'] = $val['quantity'];
if(isset($result[$val['model']]))
{
$result[$val['model']]['option'][] = $val['option'][0];
}
else
{
$result[$val['model']] = $val;
}
unset($result[$val['model']]['quantity']);
}
Ковыряюсь со старым движком ShopScriptНа странице есть цикл
Когда захожу на сайт в первый раз в адресной строке отображается id пользователя, Но когда обновляю страницу или перехожу по другой ссылке,...
Есть один и тот же функционал, реализованный разными инструментамиКакой вариант, на ваш взгляд проще читать? На выходе один из вариантов...