OVH Cloud OVH Cloud

Double foreach

2 réponses
Avatar
Thierry
Bonjour à tous.

Je suis un peu perdu quand je fais une double boucle du type :

<?php
foreach($categories as $category) {
if($category->idFather == 0) { ?>
<?=$category->label?>
...
<?php foreach($categories as $category2) {
if($category2->idFather == $category->id) { ?>
...
...

En php 4.3.8, ca marche. Ca m'affiche bien mes 10 catégories et les
sous-catégories associées. Par contre en php 4.3.10, ca n'affiche que la
premiere catégorie, et ses sous-catégories.

J'ai résolu le probleme en ajoutant
$categories2 = $categories;
et en utilisant $categories2

C'est comme si le second foreach ecrase le premier... Quelqu'un
aurait-il des infos intéressantes sur ce point ?

Titi

2 réponses

Avatar
ftc
Bonjour à tous.

Je suis un peu perdu quand je fais une double boucle du type :

<?php
foreach($categories as $category) {
if($category->idFather == 0) { ?>
<?=$category->label?>
...
<?php foreach($categories as $category2) {
if($category2->idFather == $category->id) { ?>
...
...

En php 4.3.8, ca marche. Ca m'affiche bien mes 10 catégories et les
sous-catégories associées. Par contre en php 4.3.10, ca n'affiche que la
premiere catégorie, et ses sous-catégories.


Le fonctionnement de PHP 4.3.10 me semble être le plus proche des
spécifications de PHP.

Tu entres dans ta première boucle, php fait un reset sur $categories et
prend le premier élement ...

Tu entres dans ta seconde boucle, php fait un reset sur $categories et
prend les éléments à la suite. Le compteur sur $categories se trouve
donc à la fin du tableau.

La première boucle reprend la main, mais le compteur sur $categories est
à la fin, il n'y a donc plus rien à prendre.


J'ai résolu le probleme en ajoutant
$categories2 = $categories;
et en utilisant $categories2


Perso, j'aurai fait:

for( $i=0; $i<count($categories); $i++ ) {
if($categories[$i]->idFather == 0) { ?>
...
for( $j=0; $j<count($categories); $j++ ) {
if($categories[$j]->idFather == $categories[$i]->id)
}
}
}

Avatar
Vincent Lascaux
foreach($categories as $category) {
if($category->idFather == 0) { ?>
<?=$category->label?>
...
<?php foreach($categories as $category2) {
if($category2->idFather == $category->id) { ?>
...
...


Moi j'aurais fait comme ca :
foreach($categories as $category)
if($category->idFather != 0) //!=, pas == hein ?
$subCategories[$category->idFather][] = $category;

foreach($categories as $category)
{
echo $category->label;
foreach($subCategories[$category->id] as $subCategory)
{
//...
}
}

Ca me semble plus propre et c'est en O(n) plutot que O(n²) (bon, avec 10
categories ca va pas faire une grosse difference, mais avec 1000 ca se
verra)

--
Vincent