我有多维数组:
$array = array(
array(
"id" => 1,
"value" => 100
),
array(
"id" => 1,
"value" => 200
),
array(
"id" => 1,
"value" => 300
),
array(
"id" => 2,
"value" => 2
),
array(
"id" => 2,
"value" => 5
),
array(
"id" => 3,
"value" => 10.50
),
);
我需要获得新的多维数组,如下所示:
$newArray = array(
array(
"id" => "1",
"sum_of_values" => 600
),
array(
"id" => 2,
"sum_of_values" => 7
),
array(
"id" => 3,
"sum_of_values" => 10.50
),
);
我的意思是,key [sum_of_values]应该计算具有相同键[id]的子数组中的值。
我试过这个:
$cnt = count($array);
$finalArray = array();
$tempArray = array();
for($i = 0; $i < $cnt; $i++){
if($array[$i]["id"] == $array[$i++]["id"]){
$search = $array[$i]["id"];
$column = "value";
$sum = array_sum(
array_map(
function($data) use ($column) {
return $data[$column];
},
array_filter(
$array,
function($data) use ($search) {
return fnmatch($search, $data["id"]);
}
)
)
);
$tempArray = array(
"id" => $array[$i]["id"],
"sum_of_values" => $sum
);
$finalArray[] = $tempArray;
} else {
$tempArray = array(
"id" => $array[$i]["id"],
"sum_of_values" => $array[$i]["value"]
);
}
}
它有效,它计算具有相同[id]的子数组的值。但问题是没有返回子数组,其中[id]键没有相同的例子。在我的情况下 - [id] = 3的子数组将不会返回。此外,[id] = 1且[id] = 2的子数组将重复[n-n / 2]次。
我认为,问题在于使用周期 - for ($i = 0; $i < $cnt; $i++)
和条件if ($array[$i]["id"] == $array[$i++]["id"])
,因为它看起来很愚蠢,但我无法找到其他任何内容。
答案 0 :(得分:3)
你的功能似乎太复杂了。怎么样?
$result = array();
foreach ($array as $item) {
if (!empty($result[$item['id']]))
$result[$item['id']]['sum_of_values'] += $item['value'];
else
$result[$item['id']] = array(
'id' => $item['id'],
'sum_of_values' => $item['value']
);
}
如果你得到print_r($result)
:
Array
(
[1] => Array
(
[id] => 1
[sum_of_values] => 600
)
[2] => Array
(
[id] => 2
[sum_of_values] => 7
)
[3] => Array
(
[id] => 3
[sum_of_values] => 10.5
)
)
答案 1 :(得分:1)
作为替代方案:这是array_reduce()
:
$totals = array_reduce($array, function($reduction, $current){
$id = $current["id"];
if (empty($reduction[$id])){
$reduction[$id] = ["id"=>$id, "sum_of_values"=>0];
}
$reduction[$id]["sum_of_values"] += $current["value"];
return $reduction;
}, []);
我更喜欢这种通用循环/处理的方法:我认为它更清洁一点。但是里程显然有所不同。