将数组成员向上移动一级并对匹配键的值求和

Shift Array Members Up One Level and SUM Values of Matching Keys

我有这个数据数组:

array (size=3)
  123 => 
    array (size=1)
      1 => string '50000.00' (length=8)
  126 => 
    array (size=1)
      3 => string '20000.00' (length=8)
  86 => 
    array (size=1)
      3 => string '6000.00' (length=7)

我正在尝试将每个子数组向上移动一级,如果键匹配则对总数求和。例如,结果应如下所示:

array (size=2)
  1 => string '50000.00' (length=8)
  3 => string '26000.00' (length=8)

我试过:

foreach ($weight_arr as $value)
 {
   $new_arr += $value;
 }

但最后是:

array (size=2)
  1 => string '50000.00' (length=8)
  3 => string '20000.00' (length=8)

我尝试过其他一些解决方案,但都失败了。我一定是遗漏了什么,这似乎是一件很简单的事情。

编辑:

原始数据:

array (size=7)
  0 => 
    array (size=15)
      'id' => int 17
      'wo_id' => int 12
      'prod_id' => int 123
      'qty' => int 3
      'cat_id' => int 12
      'blend' => null
      'length' => null
      'lbs' => string '50000.00' (length=8)
      'delay' => null
      'unit' => null
      'created_at' => string '2015-06-12 14:15:10' (length=19)
      'updated_at' => string '2015-06-12 14:15:10' (length=19)
      'deleted_at' => null
      'product_id' => int 123
      'truck_types_id' => int 2
  1 => 
    array (size=15)
      'id' => int 18
      'wo_id' => int 12
      'prod_id' => int 123
      'qty' => int 3
      'cat_id' => int 12
      'blend' => null
      'length' => null
      'lbs' => string '50000.00' (length=8)
      'delay' => null
      'unit' => null
      'created_at' => string '2015-06-12 14:15:10' (length=19)
      'updated_at' => string '2015-06-12 14:15:10' (length=19)
      'deleted_at' => null
      'product_id' => int 123
      'truck_types_id' => int 1
  2 => 
    array (size=15)
      'id' => int 19
      'wo_id' => int 12
      'prod_id' => int 126
      'qty' => int 2
      'cat_id' => int 12
      'blend' => null
      'length' => null
      'lbs' => string '20000.00' (length=8)
      'delay' => null
      'unit' => null
      'created_at' => string '2015-06-14 23:28:25' (length=19)
      'updated_at' => string '2015-06-14 23:28:25' (length=19)
      'deleted_at' => null
      'product_id' => int 126
      'truck_types_id' => int 2
  3 => 
    array (size=15)
      'id' => int 20
      'wo_id' => int 12
      'prod_id' => int 126
      'qty' => int 2
      'cat_id' => int 12
      'blend' => null
      'length' => null
      'lbs' => string '20000.00' (length=8)
      'delay' => null
      'unit' => null
      'created_at' => string '2015-06-14 23:28:25' (length=19)
      'updated_at' => string '2015-06-14 23:28:25' (length=19)
      'deleted_at' => null
      'product_id' => int 126
      'truck_types_id' => int 3
  4 => 
    array (size=15)
      'id' => int 12
      'wo_id' => int 12
      'prod_id' => int 86
      'qty' => int 25
      'cat_id' => int 11
      'blend' => null
      'length' => null
      'lbs' => string '6000.00' (length=7)
      'delay' => null
      'unit' => null
      'created_at' => string '2016-01-21 00:33:59' (length=19)
      'updated_at' => string '2016-01-21 00:33:59' (length=19)
      'deleted_at' => null
      'product_id' => int 86
      'truck_types_id' => int 3
  5 => 
    array (size=15)
      'id' => null
      'wo_id' => int 12
      'prod_id' => int 88
      'qty' => int 15
      'cat_id' => int 11
      'blend' => null
      'length' => null
      'lbs' => null
      'delay' => null
      'unit' => null
      'created_at' => string '2016-01-21 00:33:59' (length=19)
      'updated_at' => string '2016-01-21 00:33:59' (length=19)
      'deleted_at' => null
      'product_id' => null
      'truck_types_id' => null
  6 => 
    array (size=15)
      'id' => null
      'wo_id' => int 12
      'prod_id' => int 90
      'qty' => int 10
      'cat_id' => int 11
      'blend' => null
      'length' => null
      'lbs' => null
      'delay' => null
      'unit' => null
      'created_at' => string '2016-01-21 00:33:59' (length=19)
      'updated_at' => string '2016-01-21 00:33:59' (length=19)
      'deleted_at' => null
      'product_id' => null
      'truck_types_id' => null

创建数组的 foreach 与我一起工作:

foreach($prodArr as $prod)
 {
  if(!is_null($prod['lbs']))
    if(empty($weight_arr[$prod['truck_types_id']])) $weight_arr[$prod['prod_id']] = array($prod['truck_types_id'] => $prod['lbs'] );
 }   

由于您还没有发布完整的代码,我只是根据我对您的作业的理解从头开始重写了它。请评论,如果我在那里误解了什么...

<?php

$a = [
    123 => [1 => '50000.00'],
    126 => [3 => '20000.00'],
    86 => [3 => '6000.00']
    ];
var_export($a); 

$na = [];

foreach ($a as $subArray) {
    foreach ($subArray as $key => $value) {
        if (array_key_exists($key, $na)) $na[$key] += $value;
        else $na[$key] = $value;
    }
}

var_export($na);

请注意,使用 floatval 处理浮点数而不是字符串可能是个好主意,尽管 PHP 处理得很好,上面的代码不使用浮点数也能正常工作。

$arr = [
  123 => 
    [ 1 => '50000.00' ],
  126 => 
    [ 3 => '20000.00' ],
  86 => 
    [ 3 => '6000.00'  ]
];
$decimals = '.';
$thousands = '';

$new = array();

foreach($arr as $firstlevel) {
    foreach($firstlevel as $key => $val) {

        /* Since we have strings representing floats we need to 
         * transform them into float first and transform them
         * back to their string after adding them together
         */
        if(isset($new[$key])) {
            $new[$key] = number_format( 
                floatval($new[$key]) + floatval($val), 
                2, 
                $decimals, 
                $thousands
            );

        } else {
            $new[$key] = $val;
        }
    }
}

echo '<pre>';
print_r($new);
echo '</pre>';

如果您恰好需要那种字符串格式,请阅读 php 文档中的 number_format()floatval()。要解决您的问题,您需要使用 foreach 循环。第一个遍历数组的每个元素,第二个遍历每个子数组的每个元素。