Succession de foreach

Eléphanteau du PHP | 15 Messages

01 janv. 2009, 12:32

Bonjour,

Je voudrai après un premier explode utiliser un premier foreach, puis après un deuxième explode utiliser un deuxième foreach, puis après un troisième explode utiliser un troisième foreach,

Comme un exemple vaut mieux qu'un long discours, voici le code volontairement simplifié (et éloigné de mon vrai code, je veux pas vous donner la migraine en ce 1er janvier !) pour des raisons didactiques :

Code : Tout sélectionner

<?php $formes = "rond,carré,rectange"; $couleurs = "rouge,bleu,noir"; $tailles = "petit,moyen,grand"; // Ici, le but est d'afficher "rond rouge petit", "carré bleu moyen", "rectangle noir grand" // "Rond, rouge, petit" correspondent à la description du premier objet, "carré bleu petit" correspond à la description du deuxième objet... // Pour mémoire //$formes = explode(",", $formes); //$couleurs = explode(",", $couleurs); //$tailles = explode(",", $tailles); $formes = explode(",", $formes); foreach ($formes as $forme) { $couleurs = explode(",", $couleurs); foreach ($couleurs as $couleur) { $tailles = explode(",", $tailles); foreach ($tailles as $taille) { if ($forme == "rond") //oui, la condition est ridicule !!! {?> <p>La première forme est <?php echo $forme;?> <p>La première couleur est <?php echo $couleur;?> <p>La première taille est <?php echo $taille;?> <?php } } } } ?>
Le problème est que le code renvoie 15 lignes et non 3 comme attendu... Car j'attends comme affichage :

Code : Tout sélectionner

La première forme est rond. La première couleur est rouge. La troisième taille est petit.
Je comprends que mon code est défaillant à cause des deux foreach suivants, mais je ne sais pas comment y remédier.

Pourquoi 15 lignes s'affichent au demeurant (s'il y en avait 3 x 3 x 3, je comprendrai mieux !) ? A ce propos, il est intéressant de noter que dans les dernières lignes s'affiche La taille est Array.

En revanche, les trois premières lignes sont correctes.

Merci pour votre précieuse aide ! :)

Cordialement,

P.L. [/code]

x@v
Mammouth du PHP | 570 Messages

01 janv. 2009, 16:50

je ne vois pas le résultat.
Mais ceci me semble plus logique !
<?php
$formes = "rond,carré,rectange";
$couleurs = "rouge,bleu,noir";
$tailles = "petit,moyen,grand";

$formes = explode(",", $formes);
$couleurs = explode(",", $couleurs);
$tailles = explode(",", $tailles);
$compteur=1;
foreach ($formes as $forme):?>
    <p>La <?php echo $compteur;?> forme est <?php echo $forme;
    foreach ($couleurs as $couleur):?>
    	<p>La première couleur est <?php echo $couleur;
        foreach ($tailles as $taille):
            if ($forme == "rond"):?>
            <p>La première taille est <?php echo $taille;
            endif;
        endforeach;
    endforeach;
    $compteur++;
endforeach;?>

Ont peux connaître la profondeur d'un tableau multidimensionnel avec
count($tab, COUNT_RECURSIVE);
Ce qui me semble plus adapté à ton cas "récursif"

Eléphant du PHP | 170 Messages

02 janv. 2009, 00:26

Bonsoir,
<?php
$formes = "rond,carré,rectange";
$couleurs = "rouge,bleu,noir";
$tailles = "petit,moyen,grand";

// Ici, le but est d'afficher "rond rouge petit", "carré bleu moyen", "rectangle noir grand"

// "Rond, rouge, petit" correspondent à la description du premier objet, "carré bleu petit" correspond à la description du deuxième objet...

$formes = explode(",", $formes);
$couleurs = explode(",", $couleurs);
$tailles = explode(",", $tailles);

$nb_objets = count($formes);
for($i=0; $i<$nb_objets;$i++)
{
	echo $formes[$i],' ',$couleurs[$i],' ',$tailles[$i],"<br />\n";
}
?>

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

02 janv. 2009, 11:58

Attention, il faut prendre garde au fait que ce code n'est pas résistant si les différents tableaux ne font pas tous la même taille, en particulier si l'un des 2 derniers tableaux est plus petit que le 1er.

Sinon, la logique est là
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer