Aynı anahtar dizisinin değerlerin toplamını nasıl

5 Cevap php

Nasıl anahtar gozhi tüm değerleri ekleyebilirsiniz? 'Gozhi' tuşuna dinamik olduğunu unutmayın.

<?php
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
        )
)
?>

Örnek sonuç:

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

5 Cevap

İşte iki başkalarına benzer bir çözümdür:

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

Ama bu dizi anahtarları zaten var ve bildirimleri ne atmak değilse kontrol etmek gerekmez.

Ayrıca, kullanılarak yapılabilir 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 = array_map("sum", $rArray[0], $rArray[1], $rArray[2]);

function sum($arr1, $arr2, $arr3)
{
    return($arr1+$arr2+$arr3);
}

Aşağıda bazı avantajları ile başka bir versiyonu.

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

}

Ben bu yüzden benim app Bu kullanabilirsiniz Gumbo ait, Gravitasyon ait ve aşağıdaki hedefleri ile Chris J cevabı en iyi birleştirmek istedim:

a) döngü (Bamya) dışında 'sum' dizisi tuşları başlat. Çok büyük dizilerle performans ile yardımcı olmalıdır (henüz test değil!). Bildirimlerini ortadan kaldırır.

b) Ana mantık kılavuzları isabet olmadan anlamak kolaydır. (Gravitasyon, Chris J).

c) Aynı tuşlarla herhangi iki Dizilerin değerlerini ekleyerek daha genel problemini çözün ve alt dizi yapısına daha az bağımlı hale.

Gumbo çözümü aksine, değerler alt diziler içinde olmadığı durumlarda bu yeniden olabilir. O $arr1 ve $arr2 kodlanmış değil aşağıda örnekte hayal, ama bir döngü içinde bir işlevinin sonucu olarak iade ediliyor.

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

Bu array_walk kullanılarak da yapılabilir:

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

Bu yüzden bir önceki çözümleri gibi okunabilir ama o inşaat :)

İşte Dizi anahtarları hem de diziler için aynı olmayabilir bir versiyonu, ama hepsini nihai dizide orada olmak istiyorum.

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;
}