8768 sujets

Développement web côté serveur, CMS

Salut,
un truc m'échappe fortement...

j'ai ceci
  foreach ($results as $result) {
      var_dump("test");
    }
    foreach ($results as $result) {
    }


et j'ai bien x fois test qui s'affiche.

quand je fais cela
  foreach ($results as $result) {
    }
    foreach ($results as $result) {
      var_dump("test");
    }


je n'ai rien... je comprend pas ...
Modifié par JENCAL (01 Dec 2015 - 17:31)
Perso ça fonctionne sans problème :s.
Est ce qu'il est possible d'avoir plus d'informations sur ce que contient $results?
(Dans l'absolu je ne comprends pas pourquoi faire 2 boucles identiques avec une première qui ne fait rien..)
On est bien d'accord qu'elles ne sont pas imbriqués ?(dans le doute j'ai test et ça marche aussi)

$results=array(1, 2, 3, 4);

foreach ($results as $result) {
      //var_dump($result);
}
foreach ($results as $result) {
       var_dump($result);
}
}

$results=array(1, 2, 3, 4);

foreach ($results as $result) {
      //var_dump($result);

    foreach ($results as $result) {
            var_dump($result);
    }
}
Merci pour vos réponse.

En faite, la raison serai bien trop longue à expliqué Smiley smile je vais essayé de faire clair :

$results est le résultat d'une requêtes. la première boucle est TOUJOURS parcouru. la deuxième boucle qui se base sur le même résultat est parcourus VIA une condition qui dira "Si condition A $results = une autre requête, sinon si condition B $results = le $resultat de la même requêtes" car je vais pas recevoir les même ID bref....

Et on est d'accord, les boucles ne sont pas imbriqué. mais je pensé qu'a la fin du foreach, le tableau (ou plutot l'itération) se trouve à la fin du tableau, il faudrait que je.... reset le tableau, alors j'ai essayé avec reset(), mais non.

Merci bzh, dans le principe c'est ce que je cherche. mais je n'ai pas de classe.
Si je fais avec un array pas de problème, mais quand $results = db_query.

si je fais un ->rowCount() avant et après, j'ai toujours mes int(200) résultat. mais impossible de les parcourir.

du coup j'ai relancer la requêtes entre les foreach...
Modifié par JENCAL (02 Dec 2015 - 11:12)
Ah si c'est un retour de bdd je crois qu'il y a un pointeur à déplacer.
Du coup ca doit donner un truc comme ca :

foreach ($results as $result) {
    }
    $results->data_seek(0); //on remet le pointeur sur la 1ere ligne du tableau
    foreach ($results as $result) {
      var_dump("test");
    }
}
Merci, c'est ce que je cherche, dans le principe...
Drupal 7 ne reconnait pas data_seek, ce n'est pas mysql.
Hum je connais pas trop drupal :s
Ils ont l'air de dire que faire un fetchAll permet d'obtenir un tableau normal que l'on peut manipuler comme on veut. Du coup si je pige bien (en changeant la requête) ça devrait donner :

$results = db_query("SELECT * FROM {node}")->fetchAll();

foreach ($results as $result){}
foreach ($results as $result) {
        var_dump($result);
}

oué j'ai essayé également,

$results = db_query("ma requete");
var_dump($results) // 200 resultats

$results_2 = $results;
var_dump($results_2) // 200 resultats

foreach($results as $row){
var_dump($row); // 200 resultats
}

foreach($results_2 as $row){
var_dump($row); // 0 resultats
}


que je fetch ou pas, que je reset ou pas, que je fasse quoi que ce soit, cela ne fonctionne pas. LA seul solution que j'ai trouver, c'est de réécrire DB_QUERY avant chaque boucle.
Hum donc ça copie juste le pointeur :s.

et si tu crées un 2e array, mais qui copie les éléments un par un dans la 1ere boucle ?
Genre :

$results = db_query("ma requete");
$results2=array();

foreach($results as $row){
var_dump($row); // 200 resultats
$results2[]=$row;
}

foreach($results_2 as $row){
var_dump($row);  // 200 resultats ? ou toujours 0 ?
}
Ah oué ! dans ce cas là ça marche ! pas mal pas mal... ça m'évite de relancer ma requêtes plusieurs fois, bien que Drupal garde en cach et que ça consomme quasiment rien, c'est toujours plus propre en remplissant le deuxième tableau comme cela.

en tous cas merci à toi ! vraiment Smiley smile