将多维数组合并到单个重复值上并添加其他值

时间:2018-07-13 07:38:56

标签: php arrays multidimensional-array

我有一个订单的订单项列表,但是我们收到的Feed将单个订单项的多个数量划分为多个单独的订单项。

如果SKU相同,我需要合并和/或某些元素,并且每个SKU仅返回一个订单项。 我需要为每个项目加税,运费和运费。

[Sku]=> 47069
[QTY]=> 1
[Price]=> 5.9900
[Tax]=> 0.4200
[Shipping]=> 2.5800
[ShippingTax]=> 0.1800


[Sku]=> 241573
[QTY]=> 1
[Price]=> 6.4900
[Tax]=> 0.4700
[Shipping]=> 0.9300
[ShippingTax]=> 0.0700


[Sku]=> 241573
[QTY]=> 1
[Price]=> 6.4900
[Tax]=> 0.4500
[Shipping]=> 0.9200
[ShippingTax]=> 0.0600


[Sku]=> 241573
[QTY]=> 1
[Price]=> 6.4900
[Tax]=> 0.4500
[Shipping]=> 0.9200
[ShippingTax]=> 0.0600

这应该导致

[Sku]=> 47069
[QTY]=> 1
[Price]=> 5.9900
[Tax]=> 0.4200
[Shipping]=> 2.5800
[ShippingTax]=> 0.1800

[Sku]=> 241573
[QTY]=> 3
[Price]=> 6.4900
[Tax]=> 1.3700
[Shipping]=> 2.7800
[ShippingTax]=> 0.1900

2 个答案:

答案 0 :(得分:0)

您需要使用foreach

对其他值求和
$products[] = array(
                'Sku'=> 47069,
                'QTY'=> 1,
                'Price'=> 5.9900,
                'Tax'=> 0.4200,
                'Shipping'=> 2.5800,
                'ShippingTax'=> 0.1800,
            );

$products[] = array(
                'Sku'=> 241573,
                'QTY'=> 1,
                'Price'=> 6.4900,
                'Tax'=> 0.4700,
                'Shipping'=> 0.9300,
                'ShippingTax'=> 0.0700,
            );

$products[] = array(
                'Sku'=> 241573,
                'QTY'=> 1,
                'Price'=> 6.4900,
                'Tax'=> 0.4500,
                'Shipping'=> 0.9200,
                'ShippingTax'=> 0.0600,
            );

$products[] = array(
                'Sku'=> 241573,
                'QTY'=> 1,
                'Price'=> 6.4900,
                'Tax'=> 0.4500,
                'Shipping'=> 0.9200,
                'ShippingTax'=> 0.0600,
            );


$pr = array();
foreach($products as $product) 
{
    if(isset($pr[$product['Sku']]))
    {
        $pr[$product['Sku']]['QTY'] += $product['QTY'];
        $pr[$product['Sku']]['Tax'] += $product['Tax'];
        $pr[$product['Sku']]['Shipping'] += $product['Shipping'];
        $pr[$product['Sku']]['ShippingTax'] += $product['ShippingTax'];

    }
    else
    {
        $pr[$product['Sku']] = $product;
    }

}

输出:

Array
(
    [47069] => Array
        (
            [Sku] => 47069
            [QTY] => 1
            [Price] => 5.99
            [Tax] => 0.42
            [Shipping] => 2.58
            [ShippingTax] => 0.18
        )

    [241573] => Array
        (
            [Sku] => 241573
            [QTY] => 3
            [Price] => 6.49
            [Tax] => 1.37
            [Shipping] => 2.77
            [ShippingTax] => 0.19
        )

)

答案 1 :(得分:0)

您可以将此功能用作起点。

function combine_two_arrs($arr1, $arr2, $k='Sku') {
  $arr_final = [];
  if ($arr1[$k] == $arr2[$k]){
    $arr_final[$k] = $arr1[$k];
  } else {
    return [$arr1, $arr2];
  }
  foreach($arr1 as $k1 => $v1) {
    foreach($arr2 as $k2 => $v2) {
      if(($k1 != $k) && ($k1 == $k2)){
        $arr_final[$k1] = $v1 + $v2;
      }
    }
  }
  return $arr_final;
}

然后,您可以应用高阶函数(array_reduce可能是一个不错的选择),以将此函数应用于$products数组。

print_r(combine_two_arrs($products[0], $products[2], 'Sku'));
/*
Array
(
    [0] => Array
        (
            [Sku] => 47069
            [QTY] => 1
            [Price] => 5.99
            [Tax] => 0.42
            [Shipping] => 2.58
            [ShippingTax] => 0.18
        )

    [1] => Array
        (
            [Sku] => 241573
            [QTY] => 1
            [Price] => 6.49
            [Tax] => 0.45
            [Shipping] => 0.92
            [ShippingTax] => 0.06
        )

) 
*/

print_r(combine_two_arrs($products[1], $products[2], 'Sku'));

/*
    Array
(
    [Sku] => 241573
    [QTY] => 2
    [Price] => 12.98
    [Tax] => 0.92
    [Shipping] => 1.85
    [ShippingTax] => 0.13
)
*/