我有这个数组:
Array
(
[one] => Array
(
[a] => 0
[b] => 1
[c] => 1
[d] => 3
[e] => 1
)
[two] => Array
(
[a] => 0
[b] => 3
[c] => 1
[d] => 4
[e] => 1
)
[three] => Array
(
[a] => 3
[b] => 1
[c] => 2
[d] => 4
[e] => 1
)
)
我想将它转换为单个数组,其值是内部数组中每个值的总和,所以它可能是这样的:
Array
(
[a] => 3
[b] => 5
[c] => 4
[d] => 11
[e] => 3
)
如何实现它?
修改
这是我所做过的最好的事情:
$rest = array();
foreach($result as $key => $value){
if(is_array($value)) {
foreach($value as $k => $val){
$rest[$k] = array_sum($value);
}
}
}
但是它返回的所有值都是相同的,即每个内部键都是9。
答案 0 :(得分:2)
您可以使用array_keys
从第一个子数组获取密钥,然后使用array_sum
和array_column
生成总和数组。
foreach (array_keys($your_array['one']) as $key) {
$sums[$key] = array_sum(array_column($your_array, $key));
}
array_column
确实需要php> = 5.5。
顺便说一下,你已经拥有的东西真的很接近工作。如果你改变了
$rest[$k] = array_sum($value);
到
$rest[$k] += $val;
去吧应该不错。您之前所拥有的是重复求和整个子阵列并将其分配给每个字母键,但您只需要将当前值添加到该字母键中。
$rest[$k] += $val;
将起作用,但为第一个子数组提供未定义的索引通知。您可以通过在分配之前检查isset
来解决此问题,如下所示:
$rest[$k] = isset($rest[$k]) ? $rest[$k] + $val : $val;
我想说修改原始代码以这种方式工作可能比重新定义array_column
更好,如果你不能使用它。
答案 1 :(得分:0)
你有多维数组,为什么必须使用两个循环来理解初级。第一个循环将获得数组的每个对象,第二个数组将获得对象的参数。
$finalArray = array();
for($i = 0;$i<count($array);$i++){ // GET ALL OBJECT FROM ARRAY
foreach($array[$i] as $key=>$value){ // GET ALL KEY FROM OBJECT
$finalArray[$key] += $array[$i][$key];
}
}
print_r($finalArray);
Work on all version of PHP
答案 2 :(得分:-1)
您可以使用array_sum并循环第一维
foreach ($array as $key => $values) {
$newArray[$key] = array_sum($values);
}
答案 3 :(得分:-1)
归功于Don't Panic上面的回答和this answer,它为array_column()
提供了PHP version < 5.5
替代
// if array_column function don't exist, add array_column function
if (! function_exists('array_column')) {
function array_column(array $input, $columnKey, $indexKey = null) {
$array = array();
foreach ($input as $value) {
if ( ! isset($value[$columnKey])) {
trigger_error("Key \"$columnKey\" does not exist in array");
return false;
}
if (is_null($indexKey)) {
$array[] = $value[$columnKey];
}
else {
if ( ! isset($value[$indexKey])) {
trigger_error("Key \"$indexKey\" does not exist in array");
return false;
}
if ( ! is_scalar($value[$indexKey])) {
trigger_error("Key \"$indexKey\" does not contain scalar value");
return false;
}
$array[$value[$indexKey]] = $value[$columnKey];
}
}
return $array;
}
}
// sum up the values
$rest = array();
foreach($result as $key => $arr){
if(is_array($arr)) {
foreach($arr as $k => $val){
$rest[$k] = array_sum(array_column($result, $k));
}
}
}