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 :

Algo : MySQL to Array


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Algo : MySQL to Array
    Salut,

    Je possède une table comportant une association réflexive ( l'un des champs possède une contrainte avec un autre champ de la même table)

    voici le format de ma table :

    id(PK) description parent_id(FK reference self(ID))
    1 je suis la racine 1 (appartient à lui même...)
    2 je suis 2ème ! 1 (appartient à 1, c'est à dire racine)
    3 je suis 2ème aussi ! 1 (appartient aussi à 1)
    4 fils de 2 ! 2 (appartient à 2)
    5 2ème fils de 2 ! 2 (idem.....)
    6 fils de fils de 2 4 (id=4 est mon père ! et id=1 est mon grand père...)

    Voilà en gros, vous l'aurez compris, c'est un système d'arborescence, de diagramme, d'organigramme, comme en entreprise avec le patron, les cadres, les employés, les délégués......ou dans un site : des menus, sous menus etc...

    Ce que je souhaiterais faire c'est transformer ces données en un tableau multidimensionnel associatif :

    $tab = array( 'Je suis la racine' => array( 'Je suis 2ème' => array( 'fils de 2' => array( 'fils de fils de 2' ) , '2ème fils de 2 !') , 'Je suis 2eme aussi !') );

    Autrement dit, la clé serait l'intitulé de la description et la donnée (si il existe des enfants) est un tableau qui contiendra un/des clé(s) et une/des donnée(s) qui........(récursivité infinie)

    Je n'arrive pas à concevoir un algo qui tienne la route et qui puisse générer un tel tableau à partir d'un feed comme présenté si dessus et ce, avec un niveau de récursivité infini.

    Il est clair qu'il faut donc une fonction récursive, dont l'un des paramètres sera un tableau passé par référence et étant réécrit à chaque execution.

    [j'ai modifié la structure de la db dans ce code, afin de simplifier les choses, l'id n'est plus un INT et parent_id n'est plus un INT non plus, maintenant, la clé primaire c'est LIB (varchar) et PARENT_LIB (varchar aussi) qui fonctionnent de la même façon que l'exemple.]

    Cette fonction est fausse, certaines variables pointent vers rien du tout, j'ai posté la mauvaise version ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	protected function Parse( &$temp =array() , $parent = 0 ) {
    		$mem = array();
    		$root = MySQL::Values_Array( $this->_SQL.' WHERE parent_lib =\''.$parent.'\'' );
    		$req = MySQL::Execute( $this->_SQL.' WHERE parent_lib =\''.$root[ 'lib' ].'\'' );
    		while( $res = mysql_fetch_array( $req ) ) {
    			if( MySQL::Num_Rows( $this->_SQL.' WHERE parent_lib =\''.$root[ 'lib' ].'\'' )	> 1 )
    				self::Parse( $temp , $root[ 'lib' ] );
    			$mem[] = $res[ 'lib' ];
    		}
    		$this->_ARRAY[ $root[ 'lib' ] ] = $mem;
    	}
    $this->_SQL est une requête SQL passée au constructeur. Requête standart pour le moment : SELECT * FROM test
    $this->_ARRAY est le tableau qui sera retourné par un accesseur plus tard et qui donnera le tableau tant désiré.
    MySQL::Values_Array() fait partie de ma classe perso qui renvoit une ligne de résultat mysql de la requête passée en paramètre.

    La fonction que j'ai fait actuellement écrase apparement les données au fur et à mesure

    Si quelqu'un pouvait me sauver la vie, ça me ferait bien plaisir !

  2. #2
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    si le tableau est mal construit ça veut peut-être dire qu'il n'y a pas la bonne valeur dans $root[ 'lib' ]

  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,

    Es-tu sûr de vouloir un tableau ?
    Parce que si tu passais en POO, tu pourrais implémenter un pattern Composite.

    Un truc avait été commencé ici, mais sans nouvelles de l'auteur. Peut-être seras-tu plus prolixe.

    http://www.developpez.net/forums/d65...re-n-aire-php/

    http://devzone.zend.com/article/7

Discussions similaires

  1. [MySQL] Warning: mysql fetch array
    Par pi-2r dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/02/2010, 22h40
  2. [MySQL] Problème mysql fetch array
    Par qeenty dans le forum PHP & Base de données
    Réponses: 19
    Dernier message: 29/01/2010, 17h36
  3. [MySQL] Warning: mysql fetch array()
    Par Khaos dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 11/07/2009, 13h13
  4. Aide sur un algo entre 2 array
    Par Invité dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 03/03/2009, 17h13
  5. probleme avec mysql fetch array
    Par philsand77 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 19/04/2007, 07h56

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