134

連想キーですべての列値を追加するにはどうすればよいですか? キー セットは動的であることに注意してください。

入力配列:

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

19 に答える 19

215

を使用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.5array_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()一般的なケースの例

于 2014-12-08T10:50:56.563 に答える
99
$sumArray = array();

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

print_r($sumArray);
于 2009-09-30T08:04:47.873 に答える
28

これは他の2つと同様の解決策です:

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

ただし、これは配列キーがすでに存在するかどうかを確認する必要はなく、通知もスローしません。

于 2009-09-30T08:28:46.680 に答える
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());
}
于 2012-03-30T06:47:05.397 に答える
12
$newarr=array();
foreach($arrs as $value)
{
  foreach($value as $key=>$secondValue)
   {
       if(!isset($newarr[$key]))
        {
           $newarr[$key]=0;
        }
       $newarr[$key]+=$secondValue;
   }
}
于 2009-09-30T08:03:13.960 に答える
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、Graviton、および Chris J の最高の回答を次の目標と組み合わせて、これをアプリで使用できるようにしたかったのです。

a) ループの外で「合計」配列キーを初期化します (Gumbo)。非常に大きな配列でのパフォーマンスに役立つはずです (まだテストされていません!)。通知を削除します。

b) 主要なロジックは、マニュアルを読まなくても理解しやすいです。(グラビトン、クリスJ)。

c) 同じキーを持つ任意の 2 つの配列の値を追加するというより一般的な問題を解決し、サブ配列構造への依存度を下げます。

ガンボのソリューションとは異なり、値がサブ配列にない場合はこれを再利用できます。$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);
于 2012-02-20T10:55:30.400 に答える
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'));

以前のソリューションのように読みにくいですが、機能します:)

于 2013-08-09T12:53:08.093 に答える
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;
}
于 2013-12-11T23:36:16.180 に答える
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;

}

?>
于 2015-05-29T11:44:32.767 に答える
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);
于 2015-11-20T09:02:13.413 に答える
-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);

`
于 2017-10-12T17:59:01.963 に答える