복붙노트

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

PHP

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

어떻게 연관 키에 의해 모든 원주 값을 추가 할 수 있습니까? [gozhi] 키는 동적 임에 유의하십시오.

입력 배열 :

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
)

해결법

  1. ==============================

    1.

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

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

    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 () 예제

  3. ==============================

    3.다음은 두 개의 다른 솔루션과 유사한 솔루션입니다.

    다음은 두 개의 다른 솔루션과 유사한 솔루션입니다.

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

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

  4. ==============================

    4.또한 array_map을 사용하여 수행 할 수 있습니다.

    또한 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());
    }
    
  5. ==============================

    5.

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

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

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

    $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, Graviton, Chris J의 답변을 다음과 같은 목표와 결합하여 앱에서 사용할 수 있도록했습니다.

    a) 루프 외부의 'sum'배열 키를 초기화합니다 (Gumbo). 매우 큰 배열의 성능에 도움이 될 것입니다 (아직 테스트하지 않음). 주의 사항을 제거합니다.

    b) 주요 논리는 매뉴얼을 치지 않고 이해하기 쉽다. (Graviton, Chris 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);
    
  7. ==============================

    7.또한 array_walk를 사용하여 수행 할 수 있습니다.

    또한 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'));
    

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

  8. ==============================

    8.다음 스 니펫 사용 :

    다음 스 니펫 사용 :

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

    9.다음은 두 배열 모두에 대해 배열 키가 같지 않을 수 있지만 최종 배열에 모든 배열 키가 있어야하는 버전입니다.

    다음은 두 배열 모두에 대해 배열 키가 같지 않을 수 있지만 최종 배열에 모든 배열 키가 있어야하는 버전입니다.

    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;
    }
    
  10. ==============================

    10.배열 키가 존재하는지 먼저 확인해야합니다.

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

    암호:

    $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
    )
    

    어레이 키가없는 출력 OUTPUT :

    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
    )
    

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

  11. ==============================

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

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

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

    그리고 마지막으로:

    print_r($c);
    
  12. ==============================

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

    여기에 도착한 사람들은 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;
    
    }
    
    ?>
    
  13. ==============================

    13.여기에 내가 보통 이러한 종류의 작업을 수행하는 방법이 있습니다.

    여기에 내가 보통 이러한 종류의 작업을 수행하는 방법이 있습니다.

    // 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);
    
  14. ==============================

    14.이것은 내 laravel 프로젝트에서 훌륭하게 작동합니다.

    이것은 내 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
    
  15. ==============================

    15.

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

    16.

    $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);
    
    `
    
  17. from https://stackoverflow.com/questions/1496682/how-to-sum-all-column-values-in-multi-dimensional-array by cc-by-sa and MIT license