Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/01/2012, 10h47   #1
Débutant
 
Inscription : mai 2005
Messages : 1 957
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations forums :
Inscription : mai 2005
Messages : 1 957
Points : 615
Points : 615
Par défaut Pourquoi mes array ne fonctionnent pas de la même manière

Bonjour,
J'ai un truc que je comprends pas.
J'essaye de faire un multi array qui s'imbrique.

J'espère que vous pourrez prendre le temps de lire mon code.

J'ai créé un array à $poolCategories dans lequel je veux avoir mes menus de premier niveau, puis dans l'élément child, je veux avour tout ceux du deuxième niveau.

Dans la première requete sql, j'ai tout mes menus de premier niveau qui s'ajoute comme si j'utilisais la fonction array_push.

Par contre, pour ma seconde requete, il n'enregistre que le dernier menu du deuxième niveau.

Je pourrais utiliser la fonction array_push, pour le deuxième niveau, mais j'aimerais bien comprendre pourquoi ca marche dans le premier cas (premier niveau), mais pas dans le second.

Merci pour vos lumières

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
 
// Extract available categories 1st level
		if(isset($this->settings['fppShow']['categories']) AND $this->settings['fppShow']['categories'] == "categories" ){
 
			$queryCat1stLevel					= "SELECT * FROM "._DB_PREFIX_."category c INNER JOIN "._DB_PREFIX_."category_lang l ON c.id_category = l.id_category WHERE c.active = 1 AND c.level_depth = 1 AND l.id_lang = ".$language." ORDER BY l.name ASC";
 
			$resultCat1stLevel					= Db::getInstance()->s($queryCat1stLevel);
 
			//print_r($resultCat1stLevel);
 
			echo $nbCat1								= sizeof($resultCat1stLevel); // Commence à 1 et pas 0
 
			$poolCategories						= array();
 
			for($i=0;$i<$nbCat1;$i++){
 
				foreach($resultCat1stLevel[$i] as $key => $val){
					if($key == "id_category"){
						$poolCategories[$i][$key] = $val;
					}
					if($key == "name"){
						$poolCategories[$i][$key] = '<b>'.$val.'</b>';
					}
					if($key == "level_depth"){
						$poolCategories[$i][$key] = $val;
					}
					if($key == "id_parent"){
						$poolCategories[$i][$key] = $val;
					}	
 
 
 
 
 
						$queryCat2ndLevel					= "SELECT * FROM "._DB_PREFIX_."category c INNER JOIN "._DB_PREFIX_."category_lang l ON c.id_category = l.id_category WHERE c.active = 1 AND c.level_depth = 2 AND c.id_parent = ".$poolCategories[$i]['id_category']." AND l.id_lang = ".$language." ORDER BY l.name ASC";
 
						$resultCat2ndLevel					= Db::getInstance()->s($queryCat2ndLevel);
 
						$nbCat2								= sizeof($resultCat2ndLevel); // Commence à 1 et pas 0
 
						for($i2=0;$i2<$nbCat2;$i2++){
 
							foreach($resultCat2ndLevel[$i2] as $key2 => $val2){
 
								if($key2 == "id_category"){
									echo $key2.'<br>';
									$poolCategories[$i]['child'][$key2] = $val2;
 
								}
								if($key2 == "name"){
									echo $key2.'<br>';
									$poolCategories[$i]['child'][$key2] = '<em>'.$val2.'</em>';
 
								}
 
								if($key2 == "level_depth"){
									echo $key2.'<br>';
									$poolCategories[$i]['child'][$key2] = $val2;
 
								}
 
								if($key2 == "id_parent"){
									echo $key2.'<br>';
									$poolCategories[$i]['child'][$key2] = $val2;
								}
							}
 
						}
 
 
 
 
 
 
 
 
				}
__________________
Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!
pierrot10 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 12h22   #2
Débutant
 
Inscription : mai 2005
Messages : 1 957
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations forums :
Inscription : mai 2005
Messages : 1 957
Points : 615
Points : 615
J'ai trouvé,

Il faut remplacé ceci
Code :
$poolCategories[$i]['child'][$key2] = $val2;
par ceci
Code :
$poolCategories[$i]['child'][$i2][$key2] = $val2;
Es-ce bien ca?
__________________
Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!
pierrot10 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 12h45   #3
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 728
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 728
Points : 3 295
Points : 3 295
Salut

Citation:
Es-ce bien ca?
Je pense que c'est bien ça.

Mais à mon sens tu te compliques la tâche en faisant ça avec au total 4 boucles imbriquées alors que 2 foreach() devrait suffire, ce qui améliorerait la lisibilité/compréhension normalement.

En ne prenant que l'essentiel, on devrait pouvoir faire comme ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
// Requete SQL niveau 1
$niv_1 = 0;
foreach ($resultCat1stLevel as $catNiv_1) {
    $poolCategories[$niv_1] = $catNiv_1;
    //
    $niv_1++;
    //
    // Requete SQL niveau 2
    $niv_2 = 0;
    foreach ($resultCat2ndLevel as $catNiv_2) {
        $poolCategories[$niv_1]['child'][$niv_2] = $catNiv_2;
        //
        $niv_2++;
    }
}
Pour y mettre juste les données désirées, suffit de mettre chaque champ dans la requête (et non des SELECT *).

Et pour faire le requête du niveau 2 selon la catégorie en court, faut exploiter : $catNiv_1['id_category']

PS : ton indentation de code est un peu bizarre, ça part à des Km, non ?
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 15h23   #4
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Je pense qu'il est même possible de tout récupérer en une seule passe en modifiant légèrement le SQL comme ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   $dbPrefix = _DB_PREFIX_;
 
   $sql = <<<SQL
      SELECT *
      FROM
         $dbPrefix.category c INNER JOIN $dbPrefix.category_lang l ON c.id_category = l.id_category
      WHERE
         c.active = 1
         AND (c.level_depth = 1 OR c.level_depth = 2)
         AND l.id_lang = $language
      ORDER BY
         l.name ASC,
         c.level_depth ASC
SQL;
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 18h18   #5
Débutant
 
Inscription : mai 2005
Messages : 1 957
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations forums :
Inscription : mai 2005
Messages : 1 957
Points : 615
Points : 615
Bonjour,
Je vous remercie à tous pour vos propositions.
Ca ne marche que partiellement, mais je vais chercher car j'aime bien votre simplicité.

J'ai une autre question de passage.

J'aimerais modifier ma requete sql de maniere à n'extraire que le élément que j'ai besoin.

Ca marche quand le laisse * après le SELECT mais quand je mets ca, ca ne marche plus.
Je peux bien utilisé le c. et le l.?

Code :
1
2
3
4
5
6
 
			$queryCat1stLevel					= "	SELECT c.id_category, c.level_depth, c.id_aprent, c.active, l.id_category, l.name, l.id_lang 
													FROM "._DB_PREFIX_."category c 
													INNER JOIN "._DB_PREFIX_."category_lang l ON c.id_category = l.id_category 
													WHERE c.active = 1 AND c.level_depth = 1 AND l.id_lang = ".$language." 
													ORDER BY l.name ASC";
__________________
Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!
pierrot10 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 18h20   #6
Débutant
 
Inscription : mai 2005
Messages : 1 957
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations forums :
Inscription : mai 2005
Messages : 1 957
Points : 615
Points : 615
En fait dans la proposition de runcodephp, ca marche bien au premier niveau,
mais au deuxième niveau, ca coince, il n'y a pas de 'child' dnas smon print_r du menu premier niveau.
Je vais chercher et si je ne trouve pas je reviendrai apèrs plus de précision..
__________________
Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!
pierrot10 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 18h23   #7
Débutant
 
Inscription : mai 2005
Messages : 1 957
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations forums :
Inscription : mai 2005
Messages : 1 957
Points : 615
Points : 615
Mince, oubliez mon avant dernier post, j'avais une faute de frappe au niveau de c.id_praent... => c.id_parent
__________________
Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!
pierrot10 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h05.


 
 
 
 
Partenaires

Hébergement Web