IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Pourquoi mes array ne fonctionnent pas de la même manière


Sujet :

Langage PHP

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 098
    Points : 946
    Points
    946
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    								}
    							}
     
    						}
     
     
     
     
     
     
     
     
    				}

  2. #2
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 098
    Points : 946
    Points
    946
    Par défaut
    J'ai trouvé,

    Il faut remplacé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $poolCategories[$i]['child'][$key2] = $val2;
    par ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $poolCategories[$i]['child'][$i2][$key2] = $val2;
    Es-ce bien ca?

  3. #3
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 098
    Points : 946
    Points
    946
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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";

  6. #6
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 098
    Points : 946
    Points
    946
    Par défaut
    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..

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 098
    Points : 946
    Points
    946
    Par défaut
    Mince, oubliez mon avant dernier post, j'avais une faute de frappe au niveau de c.id_praent... => c.id_parent

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.Net/DataReader] Pourquoi mon ExecuteReader ne fonctionne pas ?
    Par emeraudes dans le forum Accès aux données
    Réponses: 8
    Dernier message: 21/08/2006, 13h38
  2. Pourquoi le "\n" ne fonctionne pas ?!
    Par bnadem35 dans le forum Langage
    Réponses: 8
    Dernier message: 13/06/2006, 23h49
  3. [javascript] pourquoi ce split de fonctionne pas ????
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/02/2006, 15h20
  4. [BCB5][FB1.5]Pourquoi cette commande ne fonctionne pas ?
    Par Sitting Bull dans le forum Débuter
    Réponses: 1
    Dernier message: 17/11/2004, 16h27
  5. [JLabel][HTML]pourquoi mes images s'affiche pas?!
    Par La Truffe dans le forum Composants
    Réponses: 8
    Dernier message: 29/04/2004, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo