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
答案 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);
}
任何其他方式这样做都会在计算上更加昂贵。