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


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

Tester si la clef existe n'est pas utile avec php, de même que la déclaration des variables du coup la fonction peut être simplifiée :


function array_melt($array1, $array2)
{
foreach ($array1 as $k => $v)
$result[$k] += $v;

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

return $result;
} // array_melt()



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

Comme je l'ai dit, j'aurais plutot fait du générique:


function array_valueMelt($listeTab)
{
foreach($listeTab as $i => $array)
{
foreach($array as $k => $v) $result[$k] += $v;
}

return $result;
}

EXEMPLE:

$array1 = array('strength' => 20, 'stamina' => 21, 'agility' => 24);
$array2 = array('strength' => 5, 'stamina' => 1, 'agility' => 4);
$array3 = array('strength' => 8, 'spirit' => 4);
$resultat = array_valueMelt(array($array1, $array2, $array3));

var_dump($resultat);



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

Une implémentation que je trouve plus élégante, qui accepte un nombre variable de tableaux :


function array_melt(){
$result = array();
foreach(func_get_args() as $array){
foreach($array as $attribute => $value){
$result[$attribute] += $value;
}
}

return $result;
}


$character_attributes = array('strength' => 20, 'stamina' => 21, 'agility' => 24);
$sword_attributes = array('strength' => 8, 'spirit' => 4);
$shield_attributes = array('stamina' => 14);

$attributes = array_melt($character_attributes, $sword_attributes, $shield_attributes);


Et son penchant en Ruby pour illustrer le splat (le * dans les arguments) et le inject (qui vient de la programmation fonctionnelle) :


def melt_attributes(*hashes)
hashes.inject({}) do |result, hash|
hash.each do |attribute, value|
result[attribute] = result[attribute].to_i + value # Pour ne pas faire += sur un objet nil !
end

result
end
end


character_attributes = { Confusedtrength => 20, Confusedtamina => 21, :agility => 24 }
sword_attributes = { Confusedtrength => 8, Confusedpirit => 4 }
shield_attributes = { Confusedtamina => 14 }

attributes = melt_attributes(character_attributes, sword_attributes, shield_attributes)

Le splat permet de transformer tous les arguments transmis dans un tableau. Il est très utile car on peu écrire un prototype de type my_function(foo, bar, *other) qui permet d'avoir des arguments variables à compter des 2 premiers.

C'est bien plus clair (et propre) qu'une fonction qui ne prend aucun argument en apparence mais qui peut en réalité en recevoir une infinité.


Sephi-Chan


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

Merci, j'avais toujours eut envi de pouvoir faire ça, sans savoir le faire.

//Argorate kiff func_get_args()


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

Ah oui j'ai oublié la ligne else dans ma function.

Mais bon, ton implémentation avec plusieurs tableaux est nickel.


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




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

C'est pour ça que je n'aime pas utiliser func_get_args dans les fonctions susceptibles d'être appelées par d'autres personnes ; généralement je m'en sers dans des fonctions internes à une librairie perso, où je sais que le type qui va y toucher sait ce qu'il fait.

Le retour implicite serait pas dur à implémenter en plus je pense, dommage que php colle autant que possible à C/C++ et pas à d'autre trucs plus sympa.


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

Oui, ou alors, quand on code bien EN GROUPE, on met toujours une définition d'une fonction que l'on code:
@param et @return + une description global si nécessaire.
Donc ce qui est implicite, on peut le rendre explicite en étant rigoureux sur les définitions des fonctions dans les commentaires Wink


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

Oui mais comme il n'y a pas de paramètres ton IDE n'aura pas un rendu correct de l'info.

Bref, évidemment que tu peux mettre des commentaires, mais c'est bancal. alors que ruby te permet de déclarer des paramètres, python à même deux façon de faire, * envoie dans une liste, ** récupère les paramètres nommés.


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

Argorate, tu te rendrais compte de pas mal de choses (bonnes ou mauvaises) si tu t'intéressais à d'autre langages.
Et si tu partageais plus souvent ton code, tu pourrais aussi avoir un regard extérieur sur tes pratiques de développement.


Sephi-Chan