다차원 배열의 모든 열 값을 합하는 방법은 무엇입니까?


116

연관 키로 모든 열 값을 추가하려면 어떻게해야합니까? 키 세트는 동적입니다.

입력 배열 :

Array
(
    [0] => Array
        (
            [gozhi] => 2
            [uzorong] => 1
            [ngangla] => 4
            [langthel] => 5
        )

    [1] => Array
        (
            [gozhi] => 5
            [uzorong] => 0
            [ngangla] => 3
            [langthel] => 2
        )

    [2] => Array
        (
            [gozhi] => 3
            [uzorong] => 0
            [ngangla] => 1
            [langthel] => 3
        )
)

원하는 결과 :

Array
(
    [gozhi] => 10
    [uzorong] => 1
    [ngangla] => 8
    [langthel] => 10
)

일반적인 상황에서 두 개의 다차원 배열에는 정확히 동일한 키가 없습니다. 병합 / 멀티 dimentional 배열 PHP 합계
크리스 Roofe

답변:


92
$sumArray = array();

foreach ($myArray as $k=>$subArray) {
  foreach ($subArray as $id=>$value) {
    $sumArray[$id]+=$value;
  }
}

print_r($sumArray);

49
키가 아직 존재하지 않기 때문에 첫 번째 반복에 대한 알림이 표시됩니다.
Gumbo

n 개의 배열이 있다면?
Muhammad Usman 2014

2
@RanaMuhammadUsman : n배열 이있는 경우이 솔루션을 사용 하십시오 .
Amal Murali

2
array_reduce 소리가 나에게 가장
예쁘다.

13
알림을 피하기 위해 $ sumArray에 값을 할당하는 줄을 다음과 같이 바꿀 수 있습니다. array_key_exists ($ id, $ sumArray)? $ sumArray [$ id] + = $ value : $ sumArray [$ id] = $ value;
Dave O'Brien

185

를 사용 array_walk_recursive()하여 문제에 대한 일반적인 솔루션을 얻을 수 있습니다 ( 각 내부 배열에 고유 키가있을 수있는 경우 ).

$final = array();

array_walk_recursive($input, function($item, $key) use (&$final){
    $final[$key] = isset($final[$key]) ?  $item + $final[$key] : $item;
});

실시 예와 array_walk_recursive()일반적인 경우를위한

또한, 이후 PHP 5.5 당신이 사용할 수있는 array_column()당신이 원하는 결과를 달성하기 위해 기능을 정확한 키를 , [gozhi]예를 들어 :

array_sum(array_column($input, 'gozhi')); 

array_column()지정된 키에 대한 예

동일한 키 ( 게시 한 원하는 결과)를 사용하여 모든 내부 배열의 총합을 얻으려면 다음과 같이 할 수 있습니다 ( 첫 번째 내부 배열은 다른 배열과 동일한 구조를 가져야 함을 염두에 두십시오). ) :

$final = array_shift($input);

foreach ($final as $key => &$value){
   $value += array_sum(array_column($input, $key));
}    

unset($value);

array_column()모든 내부 배열에 동일한 키가있는 경우의 예

array_column()다음을 사용하는 일반적인 경우 솔루션을 원한다면 처음 에는 모든 고유 키를 얻은 다음 각 키에 대한 합계를 얻을 수 있습니다.

$final = array();

foreach($input as $value)
    $final = array_merge($final, $value);

foreach($final as $key => &$value)
    $value = array_sum(array_column($input, $key));

unset($value);

실시 예와 array_column()일반적인 경우를위한


31

이 스 니펫을 사용하세요.

$key = 'gozhi';
$sum = array_sum(array_column($array,$key));

이 솔루션이 OP의 원하는 출력을 제공하는 측면에서 다소 덜 익었 음을 명확히하기 위해 질문을 편집했습니다. 즉, 답변을 확장하면 이전에 게시 된 답변의 중복이 될 가능성이 큽니다.
mickmackusa

28

다음은 다른 두 가지와 유사한 솔루션입니다.

$acc = array_shift($arr);
foreach ($arr as $val) {
    foreach ($val as $key => $val) {
        $acc[$key] += $val;
    }
}

그러나 이것은 배열 키가 이미 존재하는지 확인할 필요가 없으며 알림도 던지지 않습니다.


이 특정 어레이 구조에 대한 +1 매우 영리한 솔루션. 안타깝게도 최종 결과와 같이 구조화 된 배열의 일반적인 경우에는 작동하지 않습니다.
Todd Chaffee

22

다음을 사용하여 수행 할 수도 있습니다 array_map.

$rArray = array(
    0 => array(
        'gozhi' => 2,
        'uzorong' => 1,
        'ngangla' => 4,
        'langthel' => 5
    ),
    1 => array(
        'gozhi' => 5,
        'uzorong' => 0,
        'ngangla' => 3,
        'langthel' => 2
    ),
    2 => array(
        'gozhi' => 3,
        'uzorong' => 0,
        'ngangla' => 1,
        'langthel' => 3
    ),
);

$sumResult = call_user_func_array('array_map', array_merge(['sum'], $rArray));

function sum()
{
    return array_sum(func_get_args());
}

1
완벽한 배열의 n 개의 숫자
Dushyant 조시

1
N 개의 배열에 대해 이것을 어떻게 변경합니까?
Pathros

12
$newarr=array();
foreach($arrs as $value)
{
  foreach($value as $key=>$secondValue)
   {
       if(!isset($newarr[$key]))
        {
           $newarr[$key]=0;
        }
       $newarr[$key]+=$secondValue;
   }
}

3
이 값이 아직 존재하지 않는 경우 할당 오른쪽에있는 $ newarr [$ key]에 액세스 할 때마다 PHP 알림 (정의되지 않은 색인)을 제공합니다.
Anti Veeranna

난은 $ newarr [$ 키] 초기화 체크를 추가 생각
그 라비

4
다른 사람에게 투표하면 댓글을 남겨주세요 ... 댓글을 남기지 않으면 솔루션을 개선 할 방법이 없습니다.
Todd Chaffee 2012

@Graviton 저는 반대 투표를하지 않았지만 모든 StackOverflow 답변에는 솔루션 작동 방식 및 / 또는 권장되는 이유에 대한 설명이 포함되어야한다고 말합니다. 이 사이트 / 네트워크의 모든 페이지는 다양한 기술 / 지식을 가진 수천 명의 개발자를위한 교육 리소스입니다. (내가 코드 전용 답을 찾을 때마다을 downvoted 경우에, 나는 담당자 포인트의 실행 것입니다.)
mickmackusa

5

아래에 몇 가지 이점이있는 다른 버전입니다.

$sum = ArrayHelper::copyKeys($arr[0]);

foreach ($arr as $item) {
    ArrayHelper::addArrays($sum, $item);
}


class ArrayHelper {

    public function addArrays(Array &$to, Array $from) {
        foreach ($from as $key=>$value) {
            $to[$key] += $value;
        }
    }

    public function copyKeys(Array $from, $init=0) {
        return array_fill_keys(array_keys($from), $init);
    }

}

나는 Gumbo 's, Graviton 's 및 Chris J의 답변을 다음 목표와 결합하여 내 앱에서 사용할 수 있기를 원했습니다.

a) 루프 (검보) 외부의 '합계'배열 키를 초기화합니다. 매우 큰 어레이의 성능에 도움이됩니다 (아직 테스트되지 않았습니다!). 통지를 제거합니다.

b) 메인 로직은 매뉴얼을 치지 않고도 이해하기 쉽습니다. (그래 비튼, 크리스 J).

c) 동일한 키를 가진 두 배열의 값을 더하는보다 일반적인 문제를 해결하고 하위 배열 구조에 덜 의존하도록 만듭니다.

Gumbo의 솔루션과 달리 값이 하위 배열에없는 경우이를 재사용 할 수 있습니다. 그 다음 예에서 상상 $arr1$arr2하드 코딩되지 않지만 루프 내부 함수 호출의 결과로서 반환된다.

$arr1 = array(
    'gozhi' => 2,
    'uzorong' => 1,
    'ngangla' => 4,
    'langthel' => 5
);

$arr2 = array(
   'gozhi' => 5,
   'uzorong' => 0,
   'ngangla' => 3,
   'langthel' => 2
);

$sum = ArrayHelper::copyKeys($arr1);

ArrayHelper::addArrays($sum, $arr1);
ArrayHelper::addArrays($sum, $arr2);

4

다음을 사용하여 수행 할 수도 있습니다 array_walk.

function array_sum_values(array $input, $key) {
   $sum = 0;
   array_walk($input, function($item, $index, $params) {
         if (!empty($item[$params[1]]))
            $params[0] += $item[$params[1]];
      }, array(&$sum, $key)
   );
   return $sum;
}

var_dump(array_sum_values($arr, 'gozhi'));

이전 솔루션처럼 읽을 수는 없지만 작동합니다. :)


3

다음은 두 배열에 대해 배열 키가 동일하지 않을 수 있지만 모두 최종 배열에 있기를 원하는 버전입니다.

function array_add_by_key( $array1, $array2 ) {
    foreach ( $array2 as $k => $a ) {
        if ( array_key_exists( $k, $array1 ) ) {
            $array1[$k] += $a;
        } else {
            $array1[$k] = $a;
        }
    }
    return $array1;
}

3

먼저 배열 키가 있는지 확인해야합니다.

암호:

$sum = array();
foreach ($array as $key => $sub_array) {
    foreach ($sub_array as $sub_key => $value) {

        //If array key doesn't exists then create and initize first before we add a value.
        //Without this we will have an Undefined index error.
        if( ! array_key_exists($sub_key, $sum)) $sum[$sub_key] = 0;

        //Add Value
        $sum[$sub_key]+=$value;
    }
}
print_r($sum);

배열 키 유효성 검사가있는 출력 :

Array
(
    [gozhi] => 10
    [uzorong] => 1
    [ngangla] => 8
    [langthel] => 10
)

어레이 키 유효성 검사가없는 출력 :

Notice: Undefined index: gozhi in F:\web\index.php on line 37

Notice: Undefined index: uzorong in F:\web\index.php on line 37

Notice: Undefined index: ngangla in F:\web\index.php on line 37

Notice: Undefined index: langthel in F:\web\index.php on line 37

Array
(
    [gozhi] => 10
    [uzorong] => 1
    [ngangla] => 8
    [langthel] => 10
)

출력을 인쇄하지만 이것은 나쁜 습관입니다. 키가 있는지 항상 먼저 확인하십시오.


1

여기에 도착하여 N 배열 을 병합하고 N 배열 에서 발견 된 동일한 키의 값을 합산 하는 솔루션을 찾고있는 사람들을 위해 재귀 적으로 작동하는이 함수를 작성했습니다. (참조 : https://gist.github.com/Nickology/f700e319cbafab5eaedc )

예:

$a = array( "A" => "bob", "sum" => 10, "C" => array("x","y","z" => 50) );
$b = array( "A" => "max", "sum" => 12, "C" => array("x","y","z" => 45) );
$c = array( "A" => "tom", "sum" =>  8, "C" => array("x","y","z" => 50, "w" => 1) );

print_r(array_merge_recursive_numeric($a,$b,$c));

결과 :

Array
(
    [A] => tom
    [sum] => 30
    [C] => Array
        (
            [0] => x
            [1] => y
            [z] => 145
            [w] => 1
        )

)

코드는 다음과 같습니다.

<?php 
/**
 * array_merge_recursive_numeric function.  Merges N arrays into one array AND sums the values of identical keys.
 * WARNING: If keys have values of different types, the latter values replace the previous ones.
 * 
 * Source: https://gist.github.com/Nickology/f700e319cbafab5eaedc
 * @params N arrays (all parameters must be arrays)
 * @author Nick Jouannem <nick@nickology.com>
 * @access public
 * @return void
 */
function array_merge_recursive_numeric() {

    // Gather all arrays
    $arrays = func_get_args();

    // If there's only one array, it's already merged
    if (count($arrays)==1) {
        return $arrays[0];
    }

    // Remove any items in $arrays that are NOT arrays
    foreach($arrays as $key => $array) {
        if (!is_array($array)) {
            unset($arrays[$key]);
        }
    }

    // We start by setting the first array as our final array.
    // We will merge all other arrays with this one.
    $final = array_shift($arrays);

    foreach($arrays as $b) {

        foreach($final as $key => $value) {

            // If $key does not exist in $b, then it is unique and can be safely merged
            if (!isset($b[$key])) {

                $final[$key] = $value;

            } else {

                // If $key is present in $b, then we need to merge and sum numeric values in both
                if ( is_numeric($value) && is_numeric($b[$key]) ) {
                    // If both values for these keys are numeric, we sum them
                    $final[$key] = $value + $b[$key];
                } else if (is_array($value) && is_array($b[$key])) {
                    // If both values are arrays, we recursively call ourself
                    $final[$key] = array_merge_recursive_numeric($value, $b[$key]);
                } else {
                    // If both keys exist but differ in type, then we cannot merge them.
                    // In this scenario, we will $b's value for $key is used
                    $final[$key] = $b[$key];
                }

            }

        }

        // Finally, we need to merge any keys that exist only in $b
        foreach($b as $key => $value) {
            if (!isset($final[$key])) {
                $final[$key] = $value;
            }
        }

    }

    return $final;

}

?>

1

배열의 각 항목을 살펴보고 값을 할당하는 것이 아니라면 이전 값이있는 경우 값을 합산합니다.

<?php
$array = 
[
    [
        'a'=>1,
        'b'=>1,
        'c'=>1,
    ],
    [
        'a'=>2,
        'b'=>2,
    ],
    [
        'a'=>3,
        'd'=>3,
    ]
];

$result = array_reduce($array, function($carry, $item) {
    foreach($item as $k => $v)
        $carry[$k] = $v + ($carry[$k] ?? 0);

    return $carry;
}, []);

print_r($result);

산출:

Array
(
    [a] => 6
    [b] => 3
    [c] => 1
    [d] => 3
)

또는 각 하위 배열을 반복하고 각 열의 값을 그룹화합니다. 결국 그들을 합산하면 :

foreach($array as $subarray)
    foreach($subarray as $key => $value)
        $grouped[$key][] = $value;

$sums = array_map('array_sum', $grouped);

0

여기에 내가 일반적으로 이런 종류의 작업을 수행하는 방법이 있습니다.

// We declare an empty array in wich we will store the results
$sumArray = array();

// We loop through all the key-value pairs in $myArray
foreach ($myArray as $k=>$subArray) {

   // Each value is an array, we loop through it
   foreach ($subArray as $id=>$value) {

       // If $sumArray has not $id as key we initialize it to zero  
       if(!isset($sumArray[$id])){
           $sumArray[$id] = 0;
       }

       // If the array already has a key named $id, we increment its value
       $sumArray[$id]+=$value;
    }
 }

 print_r($sumArray);

이 코드에 대한 설명을 해주시고 왜 질문에 답해 주시겠습니까? 설명없이 코드 블록을 덤프하는 것보다 더 도움이 될 것입니다.
trincot 2015

물론이야!! 죄송합니다. 저는 스페인어입니다. 질문에 답할 때 코드가 가장 어렵다는 점을 설명해주세요. 조언의 @trincot 주셔서 감사합니다
루이스 곤잘레스

0

이것을 시도 할 수 있습니다.

$c = array_map(function () {
      return array_sum(func_get_args());
     },$a, $b);

그리고 마지막으로:

print_r($c);

1
정확히 무엇을 사용 $a하고 $b언제 전화 array_map()합니까? 이 코드 전용 답변을 개선하십시오.
mickmackusa

0

이것은 내 laravel 프로젝트에서 잘 작동합니다.

print_r($Array); // your original array

$_SUM = [];

// count($Array[0]) => if the number of keys are equall in all arrays then do a count of index 0 etc.
for ($i=0; $i < count($Array[0]); $i++) {
    $_SUM[] = $Array[0][$i] + $Array[1][$i]; // do a for loop on the count 
}

print_r($_SUM); // get a sumed up array

이것이 Laravel 프로젝트에서 작동 할 수 있지만이 질문에 대한 좋은 / 실행 가능한 솔루션은 아닙니다.
mickmackusa

-1
$sumArray = array();
foreach ($myArray as $k => $subArray) {
    foreach ($subArray as $id => $value) {
        if (!isset($sumArray[$id])) {
            $sumArray[$id] = 0;
        }
        $sumArray[$id]+=$value;
    }
}

이것은 수년 전의 답변과 중복됩니다. stackoverflow.com/a/1496697/2943403 동일한 페이지에 중복이 없도록 자신의 답변을 게시하기 전에 기존 답변을 모두 읽으십시오.
mickmackusa

-1
$sumArray = array();

foreach ($myArray as $k=>$subArray) {
  foreach ($subArray as $id=>$value) {
    if(!isset($sumArray[$id])){
     $sumArray[$id] =$value;
    }else {
     $sumArray[$id]+=$value;
    }
  }
}

print_r($sumArray);

`

좋은 답변을 작성하는 방법을 검토하십시오 . 코드 전용 답변은 질문에서 문제를 해결하는 방법을 설명하지 않으므로 권장하지 않습니다. 이 8 년 된 질문에 이미있는 많은 upvoted 답변에서 이것이 무엇을하고 어떻게 개선되는지 설명하기 위해 답변을 업데이트해야합니다.
FluffyKitten

기본적으로 이전 답변의 중복 : stackoverflow.com/a/20532196/2943403
mickmackusa

-2

예를 들어 아래와 같은 결과에서 모든 필드를 가져올 수 있습니다.

배열에서 '균형'을 선택하고 변수에 저장합니다.

$kii =   $user->pluck('balance');

다음 줄에서 u는 다음과 같이 합산 할 수 있습니다.

$sum =  $kii->sum(); 

도움이 되었기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.