PHP Array. Убрать дубли и перезаписать значение [option] из дублей

328
20 января 2017, 10:02

Всем привет! Есть массив, который приходит на 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] ?

Answer 1

Для конечного результата используйте новый массив. Хранить уже встретившиеся ключи смысла особо нет, надо "продукты" добавлять в результирующий массив с ключом - именем модели. Число товаров 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 для наглядности)

Answer 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']);
}
READ ALSO
Как извлечь счётчик массива из $smarty в php

Как извлечь счётчик массива из $smarty в php

Ковыряюсь со старым движком ShopScriptНа странице есть цикл

301
Почему исчезает модуль ?=

Почему исчезает модуль ?=

Когда захожу на сайт в первый раз в адресной строке отображается id пользователя, Но когда обновляю страницу или перехожу по другой ссылке,...

294
Читабельность кода ветвления на PHP

Читабельность кода ветвления на PHP

Есть один и тот же функционал, реализованный разными инструментамиКакой вариант, на ваш взгляд проще читать? На выходе один из вариантов...

268