Problème boucle foreach

Fermé
Laura88 - 14 oct. 2019 à 12:32
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 - 14 oct. 2019 à 14:10
Bonjour,


J'ai un soucis avec deux boucles foreach imbriquées.

J'essaie de construire un menu dynamique, avec des services et des sous services.
Dans la base de donnée, chaque sous services est lié à un service

J'ai 7 sous services au total.
Le service 1 possède 5 sous-services
Le service 2 possède 2 sous-services.

Or, dans le services 2, un seul sous services s'affiche. Je ne comprend pas où j'ai fait la faute.

<li>Services</li>
    <li>
        <?php
            foreach ( $services as $s ) : ?>
                <ul>
                    <li> 
                       <?php // nom du service
                        echo $s['nom']; ?>
                   </li> 
                    <li>
                        <ul>
                            <?php
                                foreach ( $ss_services as $ss ) :
                                    if ( $s['id'] == $ss['idServices'] ) :?>
                                        <li><?php echo $ss['nom']; ?></li>
                                    <?php else :
                                        break;
                                    endif;
                                endforeach; ?>
                        </ul>
                    </li>
                </ul>
            <?php endforeach; ?>
    </li>
</ul>

2 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
14 oct. 2019 à 13:12
Bonjour
Comment récupères tu les données ?
Via des requêtes sql?
Peux tu nous montrer..
0
Bonjour !

Oui c'est dans un fichier à part, je travaille avec une architecture MVC.
  
       public function getAll() // services
        {
            $sql = "SELECT * FROM t_services";
            $services = $this->query($sql);
            return $services;
        }

        public function getAll_sous_services () // sous-services
       {
            $sql = "SELECT * FROM t_ss_services";
            $ss_services = $this->query($sql);
            return $ss_services;
        }
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
14 oct. 2019 à 14:10
Bon, déjà... ta structure de bdd n'est pas évolutive.
Tu ne pourras toujours n'avoir que deux niveaux ( service / sous-service ). Si jamais tu voulais ajouter des niveaux supplémentaires, ta structure actuelle ne le permet pas.

Admettons que ça soit donc voulu et toujours comme ça.
Tu pourrais retravailler un peu le résutat de tes requêtes pour ensuite les manipuler plus facilement.
par exemple :
/**
* Fonction qui génère un array associatif par "service" pour les sous-services
*/
public function getAll_sous_services_array () // sous-services
{
	$result = $this->getAll_sous_services();
	$res = array();
	foreach($result as $R){
		$res[$R['idServices'][] = $R;
	}
	return $res;
}

et dans ta page
<ul>
<li>Services</li>
    <li>
        <?php
			$ss_services = $tonObjet->getAll_sous_services_array(); //ligne à adapter à ton code
			
            foreach ( $services as $s ){ 
				$serviceID = $s['id'];
			?>
                <ul>
                    <li> 
                       <?php // nom du service
                        echo $s['nom']; ?>
                   </li> 
                    <li>
                        <ul>
                            <?php
							if(!empty($ss_services[$serviceID])){
                                foreach ( $ss_services[$serviceID] as $ss ){
                                   echo "<li>" . $ss['nom'] ."</li>";
							    } //endforeach; 
							}
							?>
                        </ul>
                    </li>
                </ul>
            <?php } ?>
    </li>
</ul>

0