JeuWeb - Crée ton jeu par navigateur
[PHP] Fusion d'un tableau par addition - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [PHP] Fusion d'un tableau par addition (/showthread.php?tid=2142)

Pages : 1 2 3 4 5 6


[PHP] Fusion d'un tableau par addition - php_addict - 17-03-2011

bonjour

j'ai une question bien débile: j'ai beau avoir parcouru le manuel de php toute la soirée je ne parviens pas à trouver la fonction miracle sur une manipulation de tableau:

j'ai 2 tableaux:

- tableau 1 : 2 cerises , 3 bananes et 5 poires
- tableau 2 : 100 cerises et 20 choux

je voudrais fusionner les tableaux pour avoir ceci (donc une fusion de tableau avec addition des valeurs si la clef existe):

- result : 102 cerises , 3 bananes , 5 poires et 20 choux


$array1 = array('nb_cerises' => 2, 'nb_bananes ' => 3, 'nb_poires' => 5);
$array2 = array('nb_cerises' => 100 , 'nb_choux' => 20);

$result = array('nb_cerises' => 102, 'nb_bananes ' => 3, 'nb_poires' => 5 , 'nb_choux' => 20);

ca serait quand même étonnant que php ne dipose pas d'une fonction clef en main...

merci d'avoir lu ce petit topic botanique


RE: php array fusion et addition - niahoo - 17-03-2011

Peut-être cela vient-il du fait que les arrays peuvent contenir différents types de variables, et que par conséquent php ne doit pas décider solo de comment il doit les combiner.


RE: php array fusion et addition - Argorate - 17-03-2011

Oui, je pense aussi, comment fait-il si il doit "combiner" du texte et du int? ou alors faudrait un pré-requis qui dise qu'il faut que des chiffres...
M'enfin, je serais partie sur une petite fonction fait maison là, car je connais pas mieux, personne ne sais?


RE: php array fusion et addition - djidi - 17-03-2011

Après avoir regardé la doc, rien trouvé de particulier.
Mais en faisant ainsi ca devrait fonctionner :

- array_keys() pour lister les différentes clés des deux tableaux.
Cela te permettra de créer un nouveau tableau qui contiendra les clefs existantes initialisées à la valeur 0 dans tes tableaux.
Selon ton exemple tu devrais avoir ceci :


Array
(
[0] => nb_cerises
[1] => nb_bananes
[2] => nb_poires
[3] => nb_choux
)

Ce qui te permet de créer le tableau suivant :


Array
(
"nb_cerises" => 0
"nb_bananes" => 0
"nb_poires" => 0
"nb_choux" => 0
)

Ensuite, tu fais une boucle sur chacun des tableaux pour ajouter les valeurs.


foreach ($array1 as $k => $v)
$result[$k] += $v;

foreach ($array2 as $k => $v)
$result[$k] += $v;
Au final ton tableau devrait contenir les bonnes valeurs.


EDIT : PHP se fout complètement du type des variables. Une addition peut se faire sur une chaine de caractère ca ne posera aucun problème pour lui :


$a = 'bidule';
var_dump($a); // string(6) "bidule"

$a += 10;
var_dump($a); // int(10)

$a += 'tata';
var_dump($a); // int(10)

$a += 56.781;
var_dump($a); // float(66.781)



RE: php array fusion et addition - Nosrehl - 17-03-2011

Euh si je ne me trompe pas, il n'y a pas besoin des étapes 1 et 2 suffit d'initialiser $result à 0 pour tous les indices possibles, puis faire l'étape 3 (Code PHP 3).


RE: php array fusion et addition - djidi - 17-03-2011

Ces étapes servaient justement à avoir les clefs pour créer le tableau.
Mais après vérification il suffit de faire uniquement les 2 foreach et ca fonctionne.


RE: php array fusion et addition - Argorate - 17-03-2011

Nosrehl : oui sauf que dans ce cas ton tableau d'arrivé ne contient plus les indices de ceux des tableaux initiaux... ce qui pose certainement problème. (et de tte façon dans la demande fait plus haut, le tableau d'arrivé contient tjs les clé)
Donc à un moment où un autre, faudra utilisé array_keys() que se soti en début ou en fin d'algo.

djidi : oui il peut additionné, mais je crois que ça se fait au niveau des bits après, donc ça n'a plus grand sens en l'occurrence.

Sinon, j'aurais fait une fonction générique ^^


RE: php array fusion et addition - php_addict - 17-03-2011

ok ca me parait surprenant quand même...

allez hop, petit bout de code fait au saut du lit:


$array1 = array('nb_cerises' => 2, 'nb_bananes ' => 3, 'nb_poires' => 5);
$array2 = array('nb_cerises' => 100 , 'nb_choux' => 20);

$result= array_fusion_and_add($array1,$array2);
var_dump($result);


function array_fusion_and_add($array1,$array2)
{
$result = array();
if(count($array1)>0)
{
$result = $array1;
if(count($array2)>0)
{
foreach($array2 as $key => $t)
{
if(isset($result[$key]))
{
$result[$key] += $t;
}
else
{
$result[$key] = $t;
}
}
}
}
return($result);
}



RE: php array fusion et addition - niahoo - 17-03-2011

tu peux simplifier aussi

Code :
function array_fusion_and_add($array1,$array2) {
    foreach($array1 as $k => $v) {
        if(isset($array2[$k])) $array2[$k] += $v;
    }
    return $array2;
}

Sinon, en php l'addition de chaine et d'entier n'est pas magique, il n'est pas question de bits ou autre. Une chaine convertie en entier vaut 0 et php fait un cast implicite de la chaine en entier/float quand on l'additionne à un entier SAUF si la chaine commence par des chiffres (+'.' + 'E'), auquel cas la chaine vaut le premier nombre lisible dedans.


RE: php array fusion et addition - Sephi-Chan - 17-03-2011

Ce code ne fonctionne pas si le tableau $array1 contient moins de clés que le second.

Voici une implémentation qui fonction (edit : que je n'ai testé, quoi).


function array_melt($array, $other_array){
$keys = array_merge(array_keys($array), array_keys($other_array));
$result = array();

foreach($keys as $stat){
$result[$stat] = $array[$stat] + $other_array[$stat];
}

return $result;
}

$character_stats = array('strength' => 20, 'stamina' => 21, 'agility' => 24);
$sword_stats = array('strength' => 8, 'spirit' => 4);
$final_stats = array_melt($character_stats, $sword_stats);

Bien sûr, je suppose que le top serait de pouvoir donner à la fonction plusieurs tableaux ?


Sephi-Chan