다차원 배열의 모든 열 값을 합하는 방법은 무엇입니까?
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.
$sumArray = array(); foreach ($myArray as $k=>$subArray) { foreach ($subArray as $id=>$value) { $sumArray[$id]+=$value; } } print_r($sumArray);
-
==============================
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.다음은 두 개의 다른 솔루션과 유사한 솔루션입니다.
다음은 두 개의 다른 솔루션과 유사한 솔루션입니다.
$acc = array_shift($arr); foreach ($arr as $val) { foreach ($val as $key => $val) { $acc[$key] += $val; } }
그러나 이것은 배열 키가 이미 존재하는지 확인 할 필요가 없으며 통지도 보내지 않습니다.
-
==============================
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.
$newarr=array(); foreach($arrs as $value) { foreach($value as $key=>$secondValue) { if(!isset($newarr[$key])) { $newarr[$key]=0; } $newarr[$key]+=$secondValue; } }
-
==============================
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.또한 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.다음 스 니펫 사용 :
다음 스 니펫 사용 :
$key = 'gozhi'; $sum = array_sum(array_column($array,$key));
-
==============================
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.배열 키가 존재하는지 먼저 확인해야합니다.
배열 키가 존재하는지 먼저 확인해야합니다.
암호:
$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.이것을 시도 할 수 있습니다 :
이것을 시도 할 수 있습니다 :
$c = array_map(function () { return array_sum(func_get_args()); },$a, $b);
그리고 마지막으로:
print_r($c);
-
==============================
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.여기에 내가 보통 이러한 종류의 작업을 수행하는 방법이 있습니다.
여기에 내가 보통 이러한 종류의 작업을 수행하는 방법이 있습니다.
// 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.이것은 내 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.
$sumArray = array(); foreach ($myArray as $k => $subArray) { foreach ($subArray as $id => $value) { if (!isset($sumArray[$id])) { $sumArray[$id] = 0; } $sumArray[$id]+=$value; } }
-
==============================
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); `
from https://stackoverflow.com/questions/1496682/how-to-sum-all-column-values-in-multi-dimensional-array by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
SimpleXML : 특정 속성 값을 갖는 요소 선택하기 (0) | 2018.09.06 |
---|---|
PHP는 이미지를 MySQL에서 MySQL의 BLOB를 표시 [중복] (0) | 2018.09.06 |
PHP에서 POST의 시체를 얻는 방법? (0) | 2018.09.06 |
PHP 세션이 이미 시작되었는지 확인하십시오. (0) | 2018.09.06 |
htmlspecialchars와 mysql_real_escape_string은 PHP 코드를 주입으로부터 안전하게 유지합니까? (0) | 2018.09.06 |