Как объединить 3 массива, группировать и считать дубликаты? - PullRequest
1 голос
/ 14 марта 2020

У меня есть три связанных массива одинаковой длины, содержащих сведения о продукте.

Я пытаюсь объединить их, сгруппировать столбчатые данные (на основе идентификатора, размера и цвета) и вести подсчет каждого уникального product.

Мой код:

$a1 = array(1,1,1,2,5,1);
$a2 = array("m","m","m","s","xl","s");
$a3 = array("color","color","color3","color1","color2","color1",);

$temp = [];
foreach($a1 as $index => $product_id) {
    $size = $a2[$index];
    $colors = $a3[$index];
    // if an entry for given product id and size combination already exists, then the current
    // counter value is incremented by 1; otherwise it gets initialized with 1
    $temp[$product_id][$size] = $temp[$product_id][$size] == $temp[$product_id][$color] ? $temp[$product_id][$size]+1 : 1;
    $temp[$product_id][$colors] = $temp[$product_id][$colors]  ? $temp[$product_id][$colors]+1 : 1;
}
$result_temp = [];
foreach($temp as $product_id => $size_data) {
    foreach($size_data as $size => $count) {
        $result_temp[] = [$product_id, $size, $count];
    }
}
echo "<pre>";
print_r($result_temp);

Я получаю это как вывод:

[1] => Array
    (
        [0] => 1
        [1] => color
        [2] => 2
    )

[2] => Array
    (
        [0] => 1
        [1] => color3
        [2] => 1
    )

[3] => Array
    (
        [0] => 1
        [1] => s
        [2] => 1
    )

[4] => Array
    (
        [0] => 1
        [1] => color1
        [2] => 1
    )

[5] => Array
    (
        [0] => 2
        [1] => s
        [2] => 1
    )

[6] => Array
    (
        [0] => 2
        [1] => color1
        [2] => 1
    )

[7] => Array
    (
        [0] => 5
        [1] => xl
        [2] => 1
    )

[8] => Array
    (
        [0] => 5
        [1] => color2
        [2] => 1
    )
)

Я хочу этот вывод:

Array
(
    [0] => Array
        (
            [0] => 1  product id
            [1] => m color
            [2] => 2 this is count of m
            [3] => color this is color of product id in array 1 
        )

    [1] => Array
        (
            [0] => 1 product id 
            [1] => m color
            [2] => 1 this is count of  m
            [3] => color3 this is color of product id in array 1 
        )

    [2] => Array
        (
            [0] => 1 product id
            [1] => s color
            [2] => 1 this is count of s
            [3] => color1 this is color of product id in array 1 
        )

    [3] => Array
        (
            [0] => 2 product id
            [1] => s color
            [2] => 1 this is count of xl
            [3] => color1 
        )

    [4] => Array
        (
            [0] => 5 product id
            [1] => xl color
            [2] => 1  this is count of xl
            [3] => color2 
        )

)

1 Ответ

0 голосов
/ 14 марта 2020

Я рекомендую уменьшить глубину вашего массива группировки. Проще говоря, используйте составной временный ключ (на основе идентификатора, размера и цвета) для группировки.

После итерации вызовите array_values(), если вы хотите удалить временные ключи.

Я использовал некоторые возможности вашего входного массива и выходных значений, чтобы сделать вашу проблему и мое решение более выразительными.

Код: ( Демо )

$ids = [1, 1, 1, 2, 5, 1];
$sizes = ["m", "m", "m", "s", "xl", "s"];
$colors = ["red", "red", "yellow", "orange", "red", "orange"];

foreach ($ids as $i => $id) {
    $size = $sizes[$i];
    $color = $colors[$i];
    $tempKey = "{$id}:{$size}:{$color}";
    if (!isset($result[$tempKey])) {
        $result[$tempKey] = [
            'id' => $id,
            'size' => $size,
            'color' => $color,
            'stock' => 1
        ];
    } else {
        ++$result[$tempKey]['stock'];
    }
}
var_export(array_values($result));

Выход:

array (
  0 => 
  array (
    'id' => 1,
    'size' => 'm',
    'color' => 'red',
    'stock' => 2,
  ),
  1 => 
  array (
    'id' => 1,
    'size' => 'm',
    'color' => 'yellow',
    'stock' => 1,
  ),
  2 => 
  array (
    'id' => 2,
    'size' => 's',
    'color' => 'orange',
    'stock' => 1,
  ),
  3 => 
  array (
    'id' => 5,
    'size' => 'xl',
    'color' => 'red',
    'stock' => 1,
  ),
  4 => 
  array (
    'id' => 1,
    'size' => 's',
    'color' => 'orange',
    'stock' => 1,
  ),
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...