求和多维关联数组值,同时保留关键字名称


Sum multidimensional associative array values while preserving key names

有很多不错的问答;关于如何获取多维关联数组并在其中求和值的Stackoverflow。不幸的是,我找不到键名没有丢失的数组。

例如:

$arr=array(
      array('id'=>'1', 'amount'=>'5'),
      array('id'=>'1', 'amount'=>'5'),
      array('id'=>'2', 'amount'=>'1'),
      array('id'=>'2', 'amount'=>'3')
);

我希望得到的数组看起来像这样:

$result=array(
  array('id'=>'1', 'amount'=>'10'),
  array('id'=>'2', 'amount'=>'4')
);

不幸的是,我唯一能想到的是:

$result = array();
foreach($arr as $amount){
  if(!array_key_exists($amount['id'], $arr))          
  $result[$amount['id']] =0; 
  $result[$amount['id']] += $amount['amount'];
}

echo'd如下产生时(注意缺少密钥的单词"id"answers"amount"):

foreach($result as $id => $amount){
  echo $id."==>".$amount."'n";
}
1==>10
2==>4

这只是为了表明您已经拥有了最初需要的数据,不过,您接受的答案是更好的处理方法。

你一开始就有以下内容,对吧?

$arr = array(
    array('id'=>'1', 'amount'=>'5'),
    array('id'=>'1', 'amount'=>'5'),
    array('id'=>'2', 'amount'=>'1'),
    array('id'=>'2', 'amount'=>'3')
);

输出

Array
(
    [0] => Array
        (
            [id] => 1
            [amount] => 5
        )
    [1] => Array
        (
            [id] => 1
            [amount] => 5
        )
    [2] => Array
        (
            [id] => 2
            [amount] => 1
        )
    [3] => Array
        (
            [id] => 2
            [amount] => 3
        )
)

然后通过以下算法运行它:

$summedArr = array();
foreach ($arr as $amount) {
    $summedArr['amount'][$amount['id']] += $amount['amount'];
    $summedArr['id'][$amount['id']] = $amount['id'];
}

现在,忽略由于引用还不存在的索引而产生的Notice警告,这将输出以下内容:

输出

Array
(
    [amount] => Array
        (
            [1] => 10
            [2] => 4
        )
    [id] => Array
        (
            [1] => 1
            [2] => 2
        )
)

你看到钥匙了吗?因为我知道。

现在迭代数组:

foreach ($summedArr as $key => $value) {
    echo $k . "==>" . $v . "'n";
}

输出

amount==>Array
id==>Array

不过这不是你想要的。您想要:

foreach ($summedArr as $key => $arr) {
    foreach ($arr as $v) {
        echo $key . "==>" . $v;
    }
}

为什么不使用该方法,然后在最后重建所需的数组?

$results = array();
foreach ($arr as $id=>$amount) {
    $results[] = array('id' => $id, 'amount' => $amount);
}

这样做的任何其他方式在计算上都会更加昂贵。