2010-09-07 5 views
1

J'essaye de construire un tableau associatif multidimensionnel en récupérant les résultats d'une requête MySQL. Mais je n'arrive pas à comprendre comment y parvenir. Je veux construire un tableau comme celui-ci:Construction d'un tableau associatif multidimensionnel en utilisant PHP et MYSQL

array ("cat_name" => "category1", 
"id_cat" => "1", 
"sub_cat" => array ("name_sub_cat" => "subCategory", 
"id_sub_cat" => "4", 
     "ss_cat" =>array ("ss_cat_name" =>"ss_cat1", 
    "id_ss_cat" => "4" 
          ) 
     ) 
); 

est ici où je construis le tableau:
Edit: J'ai fini avec quelque chose comme ça, pas très sexy, mais si je pense « m presque là

while($row = mysql_fetch_assoc($resultQueryCat)){ 
    $menuArray[$row["id_cat"]]["cat_name"] = $row["cat_name"]; 
    $menuArray[$row["id_cat"]][$row["id_sub_cat"]]["id_sub_cat"] = $row["id_sub_cat"]; 
    $menuArray[$row["id_cat"]][$row["id_sub_cat"]]["name_sub_cat"] = $row["name_sub_cat"]; 
    $menuArray[$row["id_cat"]][$row["id_sub_cat"]][$row["ss_cat_name"]]["ss_cat_name"] =  $row["ss_cat_name"]; 
    $menuArray[$row["id_cat"]][$row["id_sub_cat"]][$row["ss_cat_name"]]["id_ss_cat"] = $row["id_ss_cat"]; 
            } 

Edit2: le code pour afficher le tableau

$menu.='<ul>'; 
    foreach ($menuArray as $key) { 
     $compteur_cat++; 
     $menu.= '<div id="collapsiblePanelCol'.$compteur_cat.'" class="collapsiblePanelCol floatleft"> 
     <li class="categorie"> '.$key["cat_name"].' 
      <ul>'; 
    foreach ($key as $key1) { 
if (is_array($key1){/* One of the thing i forgot which totally screwed up my results*/ 
    $menu.= '<ul> 
     <li class="ss_categorie">'.$key1["name_sub_cat"].'<ul>'; 
    foreach ($key1 as $key2) { 
       if (is_array($key2)){ 
        $menu.= '<li class="element">'.$key2["ss_cat_name"].'</li>'; } 
           } 
    $menu.= '</ul></li></ul>'; 
        } 
       } 
$menu.='</ul> 
    </li> 
    </div>'; 
    } 
    $menu.= '</ul>'; 

Merci.

Modifier final: Mon code fonctionne :) i édité le code précédent pour le rendre correct

+0

Fixez votre code pour qu'il soit lisible. – Chris

Répondre

1

Ce n'est pas une tâche facile, car les données de DB peuvent contenir des boucles :-)

je ferais mieux enregistrez-le dans id-> hashmap de données afin que vous puissiez construire la structure plus facile.

Vous ne savez pas pourquoi vous avez besoin de multidimensions.

+0

Merci pour l'aperçu, J'ai besoin de construire un menu imbriqué, et je pensais qu'un tableau multidimensionnel serait la meilleure solution. Je suis assez nouveau pour PHP, et je ne vois pas ce que sont les hashmaps. Pourriez-vous fournir quelques informations, ou peut-être je vais juste demander à mon ami google;) – rcampistron

+0

Eh bien, tout tableau est en fait hashmap. Donc, pour mettre une rangée entière dans un tableau, je ferais ceci: $ data [$ row [id]] = $ row; et au début l'initialisation est la suivante: $ data = array(); – BarsMonster

+0

Ok, je ne suis pas sur mon ordinateur en ce moment, je vais fournir un code pour compléter ma question dès que possible. – rcampistron

0

La façon dont je construis des tableaux multidimensionnels est à travers les classes et leurs objets.

Exemple:

class Categories 
{ 
    public $cat_name; 
    public $id_cat; 

    function __construct($cat_name, $id_cat) 
    { 
     $this->id = $id_cat; 
     $this->name = $cat_name; 
     $this->sub_cat = array(); 
    }  
} 

class SubCategories 
{ 
    public $name_sub_cat; 
    public $id_sub_cat; 

    function __construct($name_sub_cat, $id_sub_cat) 
    { 
     $this->id = $id_sub_cat; 
     $this->name = $name_sub_cat; 
     $this->ss_cat = array(); 
    }  
} 

class SSCategories 
{ 
    public $ss_cat_name; 
    public $id_ss_cat; 

    function __construct($ss_cat_name, $id_ss_cat) 
    { 
     $this->id = $id_ss_cat; 
     $this->name = $ss_cat_name; 
    }  
} 

alors d'écrire à ces classes (après l'extraction MySQL DB données [en supposant POO mysql]):

if($result) 
{ 
    $array = array(); 
    while($row = $result->fetch_array()) 
    { 
     $array[] = new Categories($row["cat_name"], $row["id_cat"]); 
    } 

    foreach($array as $main) 
    { 
     ... (fetching sub category info) 
     if($sub_result) 
     { 
      $sub_array = array(); 
      while($sub_row = $sub_result->fetch_array()) 
      { 
       $sub_array[] = new SubCategories($sub_row["name_sub_cat"], $sub_row["id_sub_cat"]); 
      } 
      $main->sub_cat = $sub_array; 

Vous répéterait pour chacun dans original si boucle pour que beaucoup de sous-réseaux comme vous avez. Cela a pris un certain temps :).

REMARQUE: Fermer si boucles (heirarchally) s'il n'y a plus de sous-matrices.

echo '<pre>'; 
print_r($array); 
echo '</pre>'; 

Le code ci-dessus aidera à montrer les niveaux de votre tableau!

Questions connexes