2
votes

php, additionnez deux valeurs de tableau

J'ai deux tableaux

premier tableau:

Array ( 
    [01-1970] => 0.00 
    [03-2019] => 4350 
    [04-2019] => 0.00  
    [05-2019] => 150.00 
    [06-2019] => 84.83
)

deuxième tableau:

Array ( 
    [03-2019] => 0.00
    [04-2019] => 0.00 
    [06-2019] => 34.83 
)

Ma somme attendue est:

Array ( 
    [01-1970] => 0.00 
    [03-2019] => 4350.00 
    [05-2019] => 150.00 
    [06-2019] => 50.00 
)

Comment y parvenir?


4 commentaires

Double possible de Somme des valeurs du tableau basée sur la même clé


@MayankVadiya les tableaux ont des clés différentes. ..


@treyBake il veut faire la somme des mêmes clés, vérifier la sortie attendue


@MayankVadiya true - mais le tableau à fusionner n'est pas la même clé


8 Réponses :


-2
votes
$sumArray = [];

foreach($firstArray as $key => $value) {
    $sumArray[$key] = $value + ($secondArray[$key] ?? 0);
}

1 commentaires

les réponses doivent avoir des explications afin que le PO et les futurs visiteurs puissent apprendre



0
votes

Un moyen simple de l'implémenter serait de parcourir chaque tableau et de l'ajouter à un tableau commun avec la même clé.

Faire une boucle sur un seul tableau entraînerait un manque de quelques éléments si le premier tableau est plus petit que le second ou si un élément du second tableau n'est pas présent dans le premier.

Alors passons en boucle sur les deux et ajoutons-le à la somme.

$sum = [];

foreach($firstArray as $key => $value){
  $sum[$key] = $value + (isset($sum[$key]) ? $sum[$key] : 0.0);
}
foreach($secondArray as $key => $value){
  $sum[$key] = $value + (isset($sum[$key]) ? $sum[$key] : 0.0);
}

print_r($sum);


0 commentaires

2
votes

Vous pouvez utiliser une fonction que j'ai créée:

<?php
    function array_sum_multi($arrayOne, $arrayTwo)
    {
        # get rid of keys
        $valuesOne = array_values($arrayOne);
        $valuesTwo = array_values($arrayTwo);

        //create return array
        $output = [];

        # loop that shizzle
        for ($i = 0; $i < count($valuesOne); $i++)
        {
            $output[$i] = $valuesOne[$i] + (!empty($valuesTwo[$i]) ? $valuesTwo[$i] : 0);
        }

        return $output;
    }

    $result = array_sum_multi([0.00, 4350.00, 150.00, 50.00], [0.00, 0.00, 34.83]);

    # then for your keys:
    $result = array_combine(array_keys($yourFirstArray), $result);

    echo '<pre>'. print_r($result, 1) .'</pre>';


0 commentaires

3
votes

Votre meilleur pari est de boucler les tableaux individuellement et de résumer les valeurs dans un tableau résultant au fur et à mesure. Nous pouvons créer un nouveau tableau contenant les deux tableaux pour raccourcir un peu notre code (voir comment nous définissons [$ first, $ second] comme la première boucle).

Cela supprime tout problème avec des longueurs mixtes, et conserve toutes les clés et valeurs du tableau intactes.

$result = [];
// Loop over our two arrays, here called $first and $second
foreach ([$first, $second] as $a) {
    // Loop over the values in each array
    foreach ($a as $k=>$v) {
        // If the index is new to the $result array, define it to be zero (to avoid undefined index notices) 
        if (!isset($result[$k]))
            $result[$k] = 0;

        // Sum up the value!
        $result[$k] += $v;
    }
}
print_r($result);


0 commentaires

-1
votes

Essayez ceci,

$a1 = array (
        '01-1970' => 0.00,
        '03-2019' => 4350.00,
        '05-2019' => 150.00,
        '06-2019' => 50.00
    );

$a2 = array (
        '03-2019' => 0.00,
        '04-2019' => 0.00,
        '06-2019' => 34.83
    );

$sums = array();
foreach (array_keys($a1 + $a2) as $key) {
    $sums[$key] = @($a1[$key] + $a2[$key]);
}

echo "<pre>";
print_r($sums);

Voici une autre solution que vous pouvez utiliser.

Bravo!


0 commentaires

1
votes

Vous pouvez utiliser array_keys pour obtenir l'unique des deux tableaux, puis parcourir les clés vers certaines d'entre elles

$r = [];
$keys = array_keys($a1+$a2);
foreach($keys as $v){
  $r[$v] = (empty($a1[$v]) ? 0 : $a1[$v]) + (empty($a2[$v]) ? 0 : $a2[$v]);
}

Démo de travail


0 commentaires

0
votes

Essayez cette méthode simple merci,

$sum = [];
foreach($firstArray as $key => $value){
    if(array_key_exists($key,$secondArray)){
        $newArray = [$key=>$value+$secondArray[$key]]; 
        $sum = array_merge($sum,$newArray);
    }else{
        $newArray = [$key=>$value]; 
        $sum = array_merge($sum,$newArray);
    }
}

//your final required result
var_dump($sum);


0 commentaires

1
votes
$result = $first_array; // just copy array into result

// scan second array
foreach ($second_array as $k => $v) {
   // if key already exists, then add, else just set
   $result[$k] = isset($result[$k]) ? ($result[$k] + $v) : $v;
}

// done
print_r($result);

2 commentaires

Vous avez probablement envie d'imprimer $ result , et non $ second_array ? :-) De toutes les réponses "fixes deux tableaux", c'est la manière la plus élégante, imo (ma réponse est un peu plus dynamique et peut gérer plus de 2 tableaux, c'est donc la différence ici). +1


@Qirel oui, vous avez raison. Cela devrait être $ result . Merci de l'avoir signalé. J'ai édité la réponse. Celui-ci peut également gérer plus de 2 tableaux. Il suffit de répéter foreach partie pour chaque tableau suivant. Le résultat sera la somme de tous