组数组并汇总一些值

时间:2016-02-09 23:45:08

标签: php arrays

我有数组,不想对某些值进行分组。 我的输入数组:

$input = 
(
   [0] => Array (
      [shipping] => Array
         (
            [ups] => Array
               (
                  [0] => Array
                     (
                        [name] => Next Day Air (early AM)
                        [code] => 14
                        [price] => 110.00
                     )

                   [1] => Array
                     (
                        [name] => Next Day Air
                        [code] => 01
                        [price] => 105.25
                     )
                )
          )
    )
   [1] => Array (
      [shipping] => Array
         (
            [ups] => Array
               (
                  [0] => Array
                     (
                        [name] => Next Day Air (early AM)
                        [code] => 14
                        [price] => 120.00
                     )

                   [1] => Array
                     (
                        [name] => Next Day Air
                        [code] => 01
                        [price] => 105.50
                     )
                )
          )
    )
);

我正试图得到这样的东西:

$shipping_group = array (
   [ups] => Array
      (
         [0] => Array
            (
               [name] => Next Day Air (early AM)
               [code] => 14
               [price] => 230.00
            )
         [1] => Array
            (
               [name] => Next Day Air
               [code] => 01
               [price] => 210.75
            )
      )
);

我尝试过:

$shipping_ups_total = array();

foreach($input as $box) {
    $box = (object)$box;

    if (!empty($box->shipping['ups'])) {
        foreach($box->shipping['ups'] as $m=>$method) {
            $price += $method['price'];
            $shipping_ups_total[$m]     = array(
                'name'  => $method['name'],
                'code'  => $method['code'],
                'price' => $price
            );
        }
    }
}

但我的结果错了......

2 个答案:

答案 0 :(得分:1)

如果要通过code索引值对它们进行分组,请使用该值作为键进行分组。使用它来分组和聚合所需的值。 (在这种情况下,价格)。

首先只是初始化一个容器,然后在循环中不断添加+=

$shipping_group['ups'] = array();
foreach($input as $box) {
    foreach($box['shipping']['ups'] as $ups) {
        // initialize
        $code = $ups['code']; // create your key
        if(!isset($shipping_group['ups'][$code])) {
            // initialize initial container, start the price from zero
            $shipping_group['ups'][$code] = array('name' => $ups['name'], 'code' => $code, 'price' => 0);
        }
        // after that, just continually add
        $shipping_group['ups'][$code]['price'] += $ups['price'];
    }   
}

注意:这会将代码添加为主分组数组中的键。

如果您想要解决这个问题,请使用array_values

$shipping_group['ups'] = array_values($shipping_group['ups']);

Sample Output

答案 1 :(得分:0)

我想像这样嵌套的东西会起作用。

循环提供的每个阵列。循环内部数组。循环发货信息并将发货类型(索引)推送到shipping_groups阵列。该值将是该数组中的信息。

$shipping_groups = array();
foreach($input as $arr){
    foreach($arr as $details){
        foreach($details as $shipping_type => $info){
            $shipping_types[$shipping_type]['price'] = number_format($info['price'] + $shipping_types[$shipping_type]['price'], 2, '.',',');
        }
    }
}

并且会生成以下内容,请注意我的数据不会完全反映您的数据,但结构上是正确的:

array(3) {
  ["ups"]=>
  array(1) {
    ["price"]=>
    string(6) "114.37"
  }
  ["fedex"]=>
  array(1) {
    ["price"]=>
    string(5) "87.18"
  }
  ["dhl"]=>
  array(1) {
    ["price"]=>
    string(5) "61.47"
  }
}