问题:在"subtotal'中为每个‘id’找到值的总和,并将每个id的相应总和存储在数组(或变量)中。
我目前草率的解决方案是运行foreach,其中包含多个if语句,用于计算出现次数。这对于5个id就足够了,但我必须在38个id上迭代。如果可能的话,我希望将结果按顺序存储在一个数组中。
如何提高效率?我们将不胜感激。(请看我最后的草率解决方案,开怀大笑)
期望结果:
- 所有ID之和1=10
- 所有ID之和2=18
- 所有ID之和3=14
- 所有ID之和4=4
- 所有ID之和5=3
操作的数组代码
$someArray = array(
array(
'id'=> 1,
'subtotal'=> 5),
array(
'id'=> 1,
'subtotal'=> 5),
array(
'id'=> 2,
'subtotal'=> 6),
array(
'id'=> 2,
'subtotal'=> 6),
array(
'id'=> 2,
'subtotal'=> 6),
array(
'id'=> 3,
'subtotal'=> 7),
array(
'id'=> 3,
'subtotal'=> 7),
array(
'id'=> 4,
'subtotal'=> 2),
array(
'id'=> 4,
'subtotal'=> 2),
array(
'id'=> 5,
'subtotal'=> 3),
);
倾斜解决方案
$sum_id_1 = 0;
$sum_id_2 = 0;
$sum_id_3 = 0;
$sum_id_4 = 0;
$sum_id_5 = 0;
foreach ($someArray as $k) {
if ($k['id'] == 1) {
$sum_id_1 += $k['subtotal'];
}
if ($k['id'] == 2) {
$sum_id_2 += $k['subtotal'];
}
if ($k['id'] == 3) {
$sum_id_3 += $k['subtotal'];
}
if ($k['id'] == 4) {
$sum_id_4 += $k['subtotal'];
}
if ($k['id'] == 5) {
$sum_id_5 += $k['subtotal'];
}
}
稀溶液输出(回波)
- 10
- 18
- 14
- 4
- 3
$sum = array_reduce($someArray, function($result, $item) {
if (!isset($result[$item['id']])) $result[$item['id']] = 0;
$result[$item['id']] += $item['subtotal'];
return $result;
}, array());
var_dump($sum); // array(5) { [1]=> int(10) [2]=> int(18) [3]=> int(14) [4]=> int(4) [5]=> int(3) }
对于PHP<=5.3手动执行循环计数:
$sum = array();
foreach ($someArray as $item) {
if (!isset($sum[$item['id']])) $sum[$item['id']] = 0;
$sum[$item['id']] += $item['subtotal'];
}
$arr3 = array (
"0" => array ( "001" => 10 ),
"1" => array ( "005" => 20 ),
"2" => array ( "001" => 30 ),
"3" => array ( "003" => 20 ),
"4" => array ( "005" => 80 ),
"5" => array ( "001" => 90 ),
"6" => array ( "003" => 20 ),
"7" => array ( "006" => 80 ),
"8" => array ( "006" => 90 )
) ;
array (size=4)
0 =>
array (size=1)
'001' => int 130
1 =>
array (size=1)
'005' => int 100
2 =>
array (size=1)
'003' => int 40
3 =>
array (size=1)
'006' => int 170
$outer_array = array();
$unique_array = array();
$inner_array = array();
foreach($arr3 as $key => $value)
{
$item = key($value);
if(!in_array(key($value), $unique_array))
{
array_push($unique_array, $item);
$inner_array[key($value)] = $value[$item];
$outer_array[$item][$item] = $value[$item];
}else{
$inner_array[key($value)] = $value[$item] + $inner_array[$item];
$outer_array[$item][$item] = $inner_array[$item];
}
}
var_dump(array_values($outer_array));
如果你想用同一个键来总结所有的值。不幸的是,上面的结果就是你所希望的。所以我的答案正在接近……仅此而已,希望能帮助遇到同样情况的人!