在保留键名的同时对多维关联数组值求和

时间:2013-02-05 19:57:23

标签: php arrays multidimensional-array

Stackoverflow上有很多nice Q&A关于如何获取多维关联数组并在其中求和值。不幸的是,我找不到关键名称丢失的地方。

例如:

$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“和”amount“):

foreach($result as $id => $amount){
  echo $id."==>".$amount."\n";
}

1==>10
2==>4

2 个答案:

答案 0 :(得分:1)

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

您有以下内容从右开始吗?

$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;
    }
}

答案 1 :(得分:0)

为什么不使用那个方法,然后在最后重构你想要的数组呢?

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

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