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 :

Comment bien manipuler les array multidimensionnel


Sujet :

Langage PHP

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 093
    Points : 943
    Points
    943
    Par défaut Comment bien manipuler les array multidimensionnel
    Bonjour à tous,

    Je dois reproduire l'arborescence de mon menu, et je refais tout mon code avec le but de le faire plus propre et plus simple. Simplement je me prend énormément le chou et je me demande si j'utilise la meilleur manière.
    Je travaille avec des array et je pense que ne les manipule pas correctement.

    Présentation:
    Mon arborescence (categorie ou menu) est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -root (id = 1)
    --iPod(id = 2) => level1
    ---test2 (id = 5 ) => level2
    ----test3 (id = 6) => level3
    -----test4(id = 7) => level4
    ----test33 (id = 12) => level3
    ---test22 (id = 10) => level2
    ---test222 (id = 11) => level2
    --Accessoire (id = 3) => level1
    --Portable (id = 4) => level1
    --Autres (id = 9) => level1
    J'ai créé une fonction qui va m'afficher les menus par niveau (level)
    Code PHP : 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
     
    // FUNCTION
    // $ id_parent => id de la categorire parent dont on veut connaitre ses catégorie enfant
    // $level_depth => Niveau (level) des categories
    // $langugee => langue :o) (peut d'incidence)
    function Category($id_parent, $level_depth, $language){
    	$query						= "	SELECT DISTINCT c.id_category, COUNT(cp.id_product) as nbProd, c.level_depth, c.id_parent, 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
    									LEFT JOIN "._DB_PREFIX_."category_product cp ON c.id_category = cp.id_category
    									WHERE c.active = 1 AND c.level_depth = ".$level_depth." AND c.id_parent = ".$id_parent." AND l.id_lang = ".$language." 
    									GROUP BY c.id_category
    									ORDER BY l.name ASC";
     
    	$result						= Db::getInstance()->s($query);
     
    	// Nb de categoreis du premier niveau
    	$nbCat						= sizeof($result); // Commence à 1 et pas 0
     
    	// Dans le cas des sous-categorie; s'il y en a pas pour une categorie parent, il return 0, donc rien en sortie
    	if($nbCat) 	return $result;
    }
    Cette fonction fonctionne très bien.

    Donc si je veux connaitre les categorie enfant du premier niveau je fait
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $poolCategories 	= Category(1,1,2); //ID parent, level1, langue
    print_r($poolCategories);
    et j'ai pour le nievau 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Array ( 
    	[0] => Array ( [id_category] => 3 [nbProd] => 2 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Accessoires [id_lang] => 2 ) 
    	[1] => Array ( [id_category] => 2 [nbProd] => 3 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => iPods [id_lang] => 2 ) 
    	[2] => Array ( [id_category] => 4 [nbProd] => 2 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Portables [id_lang] => 2 ) 
    	[3] => Array ( [id_category] => 9 [nbProd] => 4 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => test [id_lang] => 2 ) 
    )
    Ce qui est très bien.
    Maintenant je dois construire $poolCategories de manière à obtenir ca au final. (J'espère que les tabulations deront conservées)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Array ( 
    	[0] => Array ( [id_category] => 3 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Accessoires [id_lang] => 2 ) 
    	[1] => Array ( [id_category] => 9 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Autre [id_lang] => 2 ) 
    	[2] => Array ( [id_category] => 2 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => iPods [id_lang] => 2 [child] => Array (
    			[0] => Array ( [id_category] => 5 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test2 [id_lang] => 2 [child] => Array ( 
    					[0] => Array ( [id_category] => 6 [level_depth] => 3 [id_parent] => 5 [active] => 1 [name] => test3 [id_lang] => 2 [child] => Array ( 
    							[0] => Array ( [id_category] => 7 [level_depth] => 4 [id_parent] => 6 [active] => 1 [name] => test4 [id_lang] => 2 ) ) ) 
    					[1] => Array ( [id_category] => 12 [level_depth] => 3 [id_parent] => 5 [active] => 1 [name] => test33 [id_lang] => 2 ) ) ) 
    			[1] => Array ( [id_category] => 10 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test22 [id_lang] => 2 ) 
    			[2] => Array ( [id_category] => 11 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test222 [id_lang] => 2 ) ) ) 
    	[3] => Array ( [id_category] => 4 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Portables [id_lang] => 2 ) 
    )
    Donc mon problème, il commence la, car je vais devoir manipuler les array...
    Je ne sais pas si j'ai dois tout faire avec des forerach(), mais je me demande alors s'il y a pas plus simple à faire des fonctions liés aux array.

    Par exemple pour le niveau deux, j'y arrive sans problème car c'est simple
    Code PHP : 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
     
    $poolCatLevel2 = array();
     
    foreach($poolCategories as $key1 => $val1){
     
    	$catLevel2 						= Category($poolCategories[$key1]['id_category'],2,2);
     
     
    	if(!empty($catLevel2)){
    		$poolCategories[$key1]['child'] 	= $catLevel2;
    		$poolCatLevel2						= array_merge($poolCatLevel2, $catLevel2);
    	}
     
    }
    print_r($poolCatLevel2);
    print_r($poolCategories);
    $poolCategories m'affiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Array ( 
    	[0] => Array ( [id_category] => 3 [nbProd] => 2 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Accessoires [id_lang] => 2 ) 
    	[1] => Array ( [id_category] => 9 [nbProd] => 4 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Autre [id_lang] => 2 ) 
    	[2] => Array ( [id_category] => 2 [nbProd] => 3 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => iPods [id_lang] => 2 [child] => Array ( 
    			[0] => Array ( [id_category] => 5 [nbProd] => 1 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test2 [id_lang] => 2 ) 
    			[1] => Array ( [id_category] => 10 [nbProd] => 0 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test22 [id_lang] => 2 ) 
    			[2] => Array ( [id_category] => 11 [nbProd] => 0 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test222 [id_lang] => 2 ) ) ) 
    	[3] => Array ( [id_category] => 4 [nbProd] => 2 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Portables [id_lang] => 2 )
    )
    Ce qui est juste.
    Et $poolCatLevel2 m'affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Array ( 
    	[0] => Array ( [id_category] => 5 [nbProd] => 1 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test2 [id_lang] => 2 ) 
    	[1] => Array ( [id_category] => 10 [nbProd] => 0 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test22 [id_lang] => 2 ) 
    	[2] => Array ( [id_category] => 11 [nbProd] => 0 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test222 [id_lang] => 2 ) 
    )
    Ce qui est juste.

    Maintenat pour construire le niveau trois, la ca devient la galère, car j'utilise des foreach à tort et à travers.

    C'est là, si vous avez pu prendre le temps de me lire, que j'aimerais avoir vos lumières.
    Comment me recommendriez vous de faire, car je peux extraire (avec ma fonction) les différentes categories de chaque niveau, mais je dois les merger dans $poolCategories au bon endroit.

    Y-a-t-il matière à faire avec des fonctions array http://www.php.net/manual/en/function.array.php?

    Je vous remercie énormément pour votre lectures et consiels
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    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 : 47
    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
    Bonsoir,

    J'ai pas eu le courage de tout lire en détail mais je pense que dans ton cas de figure tu aurais besoin d'outils spécifiques fournis par la SPL comme : RecursiveArrayIterator combiné avec RecursiveIteratorIterator.

Discussions similaires

  1. Comment bien gérer les variables de session ?
    Par rad_hass dans le forum ASP.NET
    Réponses: 4
    Dernier message: 29/04/2008, 11h14
  2. Réponses: 3
    Dernier message: 29/05/2007, 17h50
  3. [Include/Require] Comment bien gérer les chemins ?
    Par Wookai dans le forum Langage
    Réponses: 1
    Dernier message: 11/04/2007, 10h11
  4. Comment bien gérer les utilisateurs multiples
    Par Vesta dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/06/2006, 09h48
  5. [JDesktopPane] Comment bien gérer les JInternalFrame ?
    Par calogerogigante dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 05/04/2006, 13h45

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