다차원 배열의 모든 열 값을 합하는 방법은 무엇입니까?
연관 키로 모든 열 값을 어떻게 추가 할 수 있습니까? 참고 [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
)
$sumArray = array();
foreach ($myArray as $k=>$subArray) {
foreach ($subArray as $id=>$value) {
$sumArray[$id]+=$value;
}
}
print_r($sumArray);
를 사용 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'));
동일한 키 ( 게시 한 원하는 결과)를 사용하여 모든 내부 배열의 총합을 얻으려면 다음과 같이 할 수 있습니다 ( 첫 번째 내부 배열은 다른 배열과 동일한 구조를 가져야 함을 염두에 두십시오). ) :
$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()
일반적인 경우를위한
다음은 다른 두 가지와 유사한 솔루션입니다.
$acc = array_shift($arr);
foreach ($arr as $val) {
foreach ($val as $key => $val) {
$acc[$key] += $val;
}
}
그러나 이것은 배열 키가 이미 존재하는지 확인할 필요가 없으며 알림도 던지지 않습니다.
다음을 사용하여 수행 할 수도 있습니다 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());
}
이 스 니펫을 사용하십시오.
$key = 'gozhi';
$sum = array_sum(array_column($array,$key));
$newarr=array();
foreach($arrs as $value)
{
foreach($value as $key=>$secondValue)
{
if(!isset($newarr[$key]))
{
$newarr[$key]=0;
}
$newarr[$key]+=$secondValue;
}
}
아래에 몇 가지 이점이있는 다른 버전입니다.
$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);
다음을 사용하여 수행 할 수도 있습니다 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'));
이전 솔루션처럼 읽을 수는 없지만 작동합니다. :)
다음은 두 배열에 대해 배열 키가 동일하지 않을 수 있지만 모두 최종 배열에 있기를 원하는 버전입니다.
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;
}
먼저 배열 키가 있는지 확인해야합니다.
암호:
$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
)
출력을 인쇄하지만 이것은 나쁜 습관입니다. 키가 있는지 항상 먼저 확인하십시오.
여기에 도착하여 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;
}
?>
여기에 내가 일반적으로 이런 종류의 작업을 수행하는 방법이 있습니다.
// 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);
이것을 시도 할 수 있습니다.
$c = array_map(function () {
return array_sum(func_get_args());
},$a, $b);
그리고 마지막으로:
print_r($c);
이것은 내 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
배열의 각 항목을 살펴보고 값을 할당하는 것이 아니라면 이전 값이있는 경우 값을 합산합니다.
<?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] = isset($carry[$k]) ? $carry[$k] + $v : $v;
return $carry;
}, []);
print_r($result);
산출:
Array
(
[a] => 6
[b] => 3
[c] => 1
[d] => 3
)
$sumArray = array();
foreach ($myArray as $k => $subArray) {
foreach ($subArray as $id => $value) {
if (!isset($sumArray[$id])) {
$sumArray[$id] = 0;
}
$sumArray[$id]+=$value;
}
}
$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);
`
예를 들어 아래와 같은 결과에서 모든 필드를 가져올 수 있습니다.
배열에서 '균형'을 선택하고 변수에 저장합니다.
$kii = $user->pluck('balance');
다음 줄에서 u는 다음과 같이 합산 할 수 있습니다.
$sum = $kii->sum();
도움이 되었기를 바랍니다.
참고 URL : https://stackoverflow.com/questions/1496682/how-to-sum-all-column-values-in-multi-dimensional-array
'Programing' 카테고리의 다른 글
저장 프로 시저가 일반적으로 최신 RDBMS의 인라인 문보다 더 효율적입니까? (0) | 2020.08.12 |
---|---|
Rails 및 PostgreSQL : 역할 postgres가 존재하지 않습니다. (0) | 2020.08.12 |
문자열에서 가장 오른쪽에있는 n 개의 문자 만 추출 (0) | 2020.08.12 |
간단한 UIAlertView 추가 (0) | 2020.08.12 |
1D numpy 배열에서 Numpy를 사용하여 로컬 최대 값 / 최소값 찾기 (0) | 2020.08.12 |