Page 1 sur 1

Affichage d'une valeur en comparant 2 tableaux

Posté : 03 mars 2014, 23:14
par Overquaz
Bonsoir :)

Je me permet de créer un sujet concernant un petit problème de comparaison de tableaux en php. #-o

J'ai un premier tableau que j'affiche sur ma page (pour information, j’utilise un moteur de template) :

Le 1er tableau (liste) :

Code : Tout sélectionner

Array ( [0] => Array ( [0] => Frodon [1] => 5 ) [1] => Array ( [0] => Aragorn [1] => 10 ) [2] => Array ( [0] => Legolas [1] => 15 )

Pour l'affichage, dans mon php :
foreach($liste as $l){
	$l['PERSO']=$l[0];
	
	$template->assign_block_vars('TABLEAU',$l);
} 
Dans mon tpl :
<!-- BEGIN TABLEAU -->
    <TD>{TABLEAU.PERSO}</TD> 
<!-- END TABLEAU -->

J'ai un second tableau (tab2), de ce type :

Code : Tout sélectionner

Array ( [Aragorn] => Array ( [1392422400] => GONDOR ) [Gandalf] => Array ( [1392422400] => MORDOR ) [Frodon] => Array ( [1392422400] => ROHAN )
Je souhaite afficher le lieu (rohan, etc ...) sur ma page, uniquement si le nom du personnage existe dans mon premier tableau.

Pour se faire, j'ai essayé d'utiliser la fonction array_key_exist dans des boucles imbriquées, mon meilleur résultat jusqu’à présent, a été d'afficher le même résultat pour tout les personnage du tableau 1, existant dans le tableau 2 ... :|



En fait, je n'arrive pas à sélectionner la bonne valeur, selon le nom du personnage et de l'afficher correctement.

Dans ce cas, j'ai un "Array to string conversion " :
foreach($liste as $l){
   $l['PERSO']=($l[0]);

      foreach($tab2 as $key => $val){
	  $test[$key]=$val;
          if (array_key_exists($l[0],$test)){
	     $l['LIEU']=$test[$l[0]];
	  }else{
	     $l['LIEU']='';
	  }	
      }
   $template->assign_block_vars('TABLEAU',$l);
}

Une petite aide serait la bienvenue svp. :mrgreen:
merci

Re: Affichage d'une valeur en comparant 2 tableaux

Posté : 03 mars 2014, 23:27
par jojolapine
Bonsoir,

Il me semble que tu n'as pas besoin de foreach si tu testes déjà l'existence de la clé.
En fait tu testes la clé sur le "sous-tableau"

Code : Tout sélectionner

Array ( [1392422400] => GONDOR )
Donc il ne trouve pas le personnage.
foreach($liste as $l){

   	$l['PERSO']=($l[0]);

	if (array_key_exists($l[0],$tab2)) {

		$l['LIEU']=$tab2[$l[0]];
	}
	else {
		$l['LIEU']='';
	}   

	$template->assign_block_vars('TABLEAU',$l);
}
 

Re: Affichage d'une valeur en comparant 2 tableaux

Posté : 03 mars 2014, 23:38
par Overquaz
Merci pour votre réponse.

Quand je ne met pas le foreach (de la boucle imbriquée), j'ai "Array to string conversion'
Dois-je modifier la structure du tableau que je souhaite imbriquée ?

merci

Re: Affichage d'une valeur en comparant 2 tableaux

Posté : 04 mars 2014, 10:08
par jojolapine
Bonjour,

Effectivement il subsiste une erreur !
Dans ce cas là, essaye de débuger en faisant un var_dump de $tab2[$l[0]]
Tu verras qu'effectivement c'est un tableau.
A toi ensuite de décider si tu dois prendre la première entrée (array_shift), la dernière (array_pop), etc...

Re: Affichage d'une valeur en comparant 2 tableaux

Posté : 04 mars 2014, 11:41
par Overquaz
Bonjour

Quand je fais mon VAR_DUMP($tab2[$l[0]]), j'ai :

Undefined index sur certaines lignes

et parfois, j'ai quelque chose :

Code : Tout sélectionner

array(1) { [1378245600]=> string(7) "Aragorn" }
ça doit-être quand il trouve que la valeur existe dans le premier tableau.

En tout cas, je pense que tu as résolu mon problème avec "array_pop", que je ne connaissais pas, je vais faire quelques contrôles au cas où :wink:
Je te remercie grandement ! =D>

Re: Affichage d'une valeur en comparant 2 tableaux

Posté : 05 mars 2014, 16:41
par Overquaz
Bonjour
Juste si je peux encore abuser un peu de votre temps.

Les informations affichées sont bel et bien correctes, néanmoins, je n'arrive à avoir le résultat, que sur la première ligne trouvée dans mon tableau.

En reprenant l'exemple énoncé, il se peut que dans mon premier tableau, j'ai plusieurs fois la même clé (prénom) et je souhaiterai qu'à chaque fois que cette clé apparaît dans mon tableau 1, que le résultat du tableau 2 apparaisse.

mon code php :
foreach($liste as $l){
        $l['PERSO']=($l[0]);
        if (array_key_exists($l[0],$tab2)) {
                $l['LIEU']=array_pop($tab2[$l[0]]);
        }
        else {
                $l['LIEU']='';
        }  
        $template->assign_block_vars('TABLEAU',$l);
}
Je n'ai pas trouvé de fonction récursive avec array_key_exists , mais je pensais que ça le faisait nativement, une autre fonction est disponible pour ce cas de figure ?
Au final, je n'ai le résultat que de la première ligne trouvée dans mon tableau, les autres lignes (dont le prénom est identique) sont vides :?

Pourriez-vous m'aider sur ce point svp ?
merci

Re: Affichage d'une valeur en comparant 2 tableaux

Posté : 05 mars 2014, 22:43
par jojolapine
Bonsoir,

Tu peux essayer d'utiliser la fonction reset() (http://fr2.php.net/reset) qui retourne simplement la valeur du premier élément du tableau.
Contrairement à array_pop() qui modifie le tableau en question.

Cordialement,

[RESOLU] Affichage d'une valeur en comparant 2 tableaux

Posté : 06 mars 2014, 19:34
par Overquaz
Bonjour,
ça semble fonctionner très correctement, encore une fois, merci ! =D>