0

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

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

1==>10
2==>4
4

2 回答 2

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;
    }
}
于 2013-02-05T20:15:41.597 回答
0

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

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

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

于 2013-02-05T20:01:14.247 回答