Foreach boucles imbriquées

Default
,

Bonjour,

je n'arrive pas à utiliser foreach en boucles (2) imbriquées

Ce que je fais

Décrivez ici votre code ou ce que vous cherchez à faire

// $horaires est un objet pdo résultant d'une sélection dans une table; resultat en objet
// $postes est un autre objet pdo sur une autre table
            foreach ($horaires as $creneau ) { // liste des creneaux
                $_POST['creneau'] = $creneau->creneau;
                foreach($postes as $poste){
                    $_POST['poste_id'] = $poste->id;
                    debug($_POST);               
                }
           }

Ce que je veux

Dans horaires, j'ai 3 créneaux 1,2 et 3
Dans postes, j'ai 5 postes a, b, c , d et e
je pensais obtenir en variables $_POST, l'imbrication des postes pour chaque creneau
1 a b c d e
2 a b c d e
3 a b c d e

Ce que j'obtiens

le résultat donne
1 a b c d e
et la lecture des creneaux suivants n'est pas effectuée

Si j'enlève la bloucle centrale sur les postes je retrouve tous les creneaux
1
2
3

J'ai essayé avec des boucles while et j'ai le même résultat ;(
Merci d'avance pour vos remarques.

4 Réponse

17162
,

Bonjour.
Ton principal problème est que tu appréhendes mal le contexte dans lequel tu te mets.
Pour que ton système soit correct, le mieux serait que tu puisses faires une relations entre ta table qui concerne les horaires et celle qui concerne les postes, de cette manière tu n'aurais même pas à faire de boucles pour créer ton tableau, car tu obtiendrais déjà le résultat que tu veux obtenir.
Ensuite, quelle est cette idée de vouloir créer un tableau sur la variable $_POST ?
De plus que je ne sais pas ce que fait exactement la fonction debug, en tout cas tu la place au mauvais endroit, si tu veux faire un debug de chaque creneau, il te faut la placer à l'extérieur de ta seconde boucle, tu devrais plutôt faire quelque chose comme :

$tab = [];
foreach ($horaires as $c => $creneau ) 
{
    $tab[$c]['creneau'] = $creneau->creneau;
}
for ($i = 0; $i < count($horaires); $i++)
{
  foreach ($postes as $p => $poste)
  {
      $tab[$i]['postes'][$p]['id'] = $poste->id;
      $i++;
  }
}
debug($tab);

Ce qui devrait te donner quelque chose comme :

array (
    0 => array(
        'creneau' => 1,
        'postes' => array(
            0 => array('id' => 'a'), 1 => array('id' => 'b'), 2 => array('id' => 'c'), 3 => array('id' => 'd'), 4 => array('id' => 'e')
        )
    ),
    1 => array(
        'creneau' => 2,
        'postes' => array(
            0 => array('id' => 'a'), 1 => array('id' => 'b'), 2 => array('id' => 'c'), 3 => array('id' => 'd'), 4 => array('id' => 'e')
        )
    ),
    2 => array(
        'creneau' => 2,
        'postes' => array(
            0 => array('id' => 'a'), 1 => array('id' => 'b'), 2 => array('id' => 'c'), 3 => array('id' => 'd'), 4 => array('id' => 'e')
        )
    )
)
Default
,

merci Laktar pour ta réponse claire et rapide !
Je vais essayer ça et je rapporterai les résultats.

17162
,

Tu peux très bien simplifier/raccourcir, par exemple :

$creneaux = array_map(function ($horaire) use ($postes) {
    return [
        'creneau' => $horaire->creneau,
        'postes' => array_map(function ($poste) {
            return ['id' => $poste->id];
        }, $postes)
    ];
}, $horaires);

Ce qui donnera exactement comme le résultat que j'ai donné dans mon précédent post.

Default
,

Encore merci Lartak tu ne m'as pas donné la solution directement, mais tu m'as donner de quoi réfléchir et finalement en trouver une.
En fait, mon $postes qui est le résultat d'une requette avec pdo, je le récupère en tableau, et là, les boucles imbriquées fonctionnent:

foreach ($horaires as $creneau) 
            {
                $_POST['creneau'] = $creneau->creneau;
                foreach ($poste as $k2 =>$v2)
                    {
                        $_POST['poste_id'] = $k2;
                        $db->tableAdd($_POST); // creation des lignes créneau-poste (1 par poste)                   
                    }
            }