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 :

[Tableaux] transformer les données d'une BDD en array ()


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 60
    Points : 35
    Points
    35
    Par défaut [Tableaux] transformer les données d'une BDD en array ()
    Salut à tous,

    Je début en php et j'essais de me faire un menu qui se dévelloppe avec une class que j'ai trouvé sur le net. il s'agit de multiXpandMenu.

    J'ai une base de données avec mes catégories et qui a cette forme :
    cat_id, cat_nom, cat_id_parent, cat_url, cat_level

    Les catégories n'ayant pas de parent ont un cat_parent_id = 1

    Pour créer dynamiquement mon menu, il faut que j'arrive à mettre les catégories sous forme de array ayant cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $items = array    (
                        "node1" => "http://www.node1.com",
                        "node2" => array(
                                            "node21" => "http://www.node21.com",
                                            "node22" => "http://www.node22.com",
                                            "node23" => array    (
                                                                    "node231" => "http://www.node231.com",
                                                                    "node232" => "http://www.node232.com",
                                                                )
                                        ),
                        "node3" => "http://www.node3.com",
                    );
    J'ai passé la journée entière dessus, mais je n'y arrive pas...
    Est ce que vous pourriez m'aider svp?
    Merci d'avance
    +
    DaD

  2. #2
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    Salut, je viens de me pencher sur ton problème à partir d'un tableau normal (la même chose qu'une table sql), voilà ta solution :
    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
    /*
    ** Représentation de ta table, avec les champs :
    ** - id qui est une id unique
    ** - parent qui pointe sur l'ID du parent, j'ai mis comme id 0 si pas de parents
    ** - level qui corespond au niveau où se situe la catégorie, par défaut le niveau le plus bas est 1
    ** - url ton champ texte qui contient ce que te veux (ton url dans ton cas)
    */
    $ary = array(
    	array(
    		'id' =>		1,
    		'parent' =>	0,
    		'level' =>	1,
    		'url' =>	'url1',
    	),
    	array(
    		'id' =>		2,
    		'parent' =>	0,
    		'level' =>	1,
    		'url' =>	'url2',
    	),
    	array(
    		'id' =>		3,
    		'parent' =>	2,
    		'level' =>	2,
    		'url' =>	'url3',
    	),
    	array(
    		'id' =>		4,
    		'parent' =>	2,
    		'level' =>	2,
    		'url' =>	'url4',
    	),
    	array(
    		'id' =>		5,
    		'parent' =>	3,
    		'level' =>	3,
    		'url' =>	'url5',
    	),
    );
     
    // La fonction qui te créé récusivement ton arbre
    function fill_tree($ary, $parent = 0, $level = 1)
    {
    	$tree = array();
    	foreach ($ary AS $item)
    	{
    		if ($item['level'] == $level)
    		{
    			if ($item['parent'] == $parent)
    			{
    				$tree['cat_' . $item['id']] = $item['url'];
    				$childs = fill_tree($ary, $item['id'], $level + 1);
     
    				if ($childs)
    				{
    					$tree['cat_' . $item['id']] = $childs;
    				}
    			}
    		}
    	}
    	return ($tree);
    }
     
    // Et voilà $tree contient le résultat
    $tree = fill_tree($ary);
    echo '<pre>';
    print_r($tree);
    echo '</pre>';
    @+

  3. #3
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Bonjour,

    Si tu débutes en php, c'est le moment parfait pour te pencher directement sur php5 et la programmation objet.
    La POO répondra parfaitement à la construction de structures de ce type avec l'avantage de la lisibilité en plus.

  4. #4
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    J'ai pas tout à fait saisi le rapport avec ce qu'il veut faire et la programmation objet ... Tu aurais un exemple ?

  5. #5
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Alors pour commencer, je prendrais une approche descendante avec des id_enfant plutôt qu'ascendante avec des id_parent. Ca me semble un peu plus naturel comme construction et c'est il me semble ton approche dans ta fonction récursive.

    Disons que j'ai un objet objCat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Cat {
        public $id;
        public $nom;
        public $idparent;
        public $url;
        public $level;
        public $objenfant; // objet enfant de classe colCat voir ci-dessous
    }
    Je remplis un objet colCat pour chaque niveau (level), avec un itérateur pour parcourir la collection (on en parle dans le forum) :
    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
     
    class colCat implements IterratorAggregate {
        public $level;
        public $tabCat = array(); // tableau d'objets Cat
     
        public function Ajouter($cat) {
            $tabCat[$cat->id] = $cat;
            return $cat->id;
        }
     
        public function TrouverCat($id) {
            return $tabCat[$id];
        }
     
    }
    Si la requête renvoie un curseur classé par id_parent, toutes les classes peuvent se construire en même temps, sans même avoir à faire appel à la récursivité.

    Cette récursivité sera utile pour afficher tout le menu, d'une façon que tu as très bien illustrée.

    Et ensuite, toute utilisation est possible avec l'avantage syntaxique de la POO.

    PS: évidemment, il manque les constructeurs et plusieurs méthodes utiles, mais l'esprit est là et je suis au boulot...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Points : 164
    Points
    164
    Par défaut
    bonjour à tous.

    La POO répondra parfaitement à la construction de structures de ce type avec l'avantage de la lisibilité en plus.
    pas faux si on veut implémenter des fonctions pour ajouter des pages, les modifier ou les supprimer.

    Dans le contexte présenté ici, un tableau se suffit à lui-même puisqu'on a juste besoin d'une simple liste.

    Quant à la lisibilité, je ne suis pas vraiment d'accord avec toi...

  7. #7
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    Effectivement c'est très élégant comme méthode, je ne connaissais pas ces interfaces définies dans php5, une belle illustration de la puissance de la POO avec PHP5 !
    Merci.

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

Discussions similaires

  1. EXT-GWT: afficher les données d'une bdd dans une grid
    Par baya1 dans le forum GWT et Vaadin
    Réponses: 9
    Dernier message: 20/11/2011, 01h14
  2. Chriffrer les données d'une BDD sous Access 2003
    Par megatoune dans le forum Sécurité
    Réponses: 3
    Dernier message: 27/01/2008, 00h25
  3. transferer les donnes d'une BDD vers un fichier XML?
    Par bylka dans le forum XQUERY/SGBD
    Réponses: 6
    Dernier message: 12/11/2007, 10h11
  4. Afficher et modifier les données d'une bdd
    Par gathe77 dans le forum ASP
    Réponses: 16
    Dernier message: 29/08/2007, 17h19
  5. transformer les données d'une table .dbf vers ma BD
    Par djouahra.karim1 dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/11/2004, 10h54

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