php - 具有总和的多维数组到单维数组

时间:2016-04-05 17:11:33

标签: php arrays multidimensional-array

我有这个数组:

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。

4 个答案:

答案 0 :(得分:2)

您可以使用array_keys从第一个子数组获取密钥,然后使用array_sumarray_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));               
            }
        }
    }