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 :

Hiérarchisation d'objet dans un tableau


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 248
    Par défaut Hiérarchisation d'objet dans un tableau
    salut à tous...
    voila, j'ai un petit pb ... de hyerarchisation de catégories ...

    je récupère un résultat sql genre ça

    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
    array
      0 => 
        object(stdClass)[12]
          public 'idCategorie' => string '4' (length=1)
          public 'nomCategorie' => string 'Cat 1' (length=5)
          public 'parent' => null
      1 => 
        object(stdClass)[11]
          public 'idCategorie' => string '5' (length=1)
          public 'nomCategorie' => string 'cat 2' (length=5)
          public 'parent' => null
      2 => 
        object(stdClass)[10]
          public 'idCategorie' => string '6' (length=1)
          public 'nomCategorie' => string 'cat 1.1' (length=7)
          public 'parent' => string '4' (length=1)
      3 => 
        object(stdClass)[1]
          public 'idCategorie' => string '7' (length=1)
          public 'nomCategorie' => string 'cat 1.2' (length=7)
          public 'parent' => string '4' (length=1)
      4 => 
        object(stdClass)[14]
          public 'idCategorie' => string '8' (length=1)
          public 'nomCategorie' => string 'cat 1.1.1' (length=9)
          public 'parent' => string '6' (length=1)
    donc dans chaque catégorie j'ai un id et l'id du parent si besoin...
    j'aimerai passer tout ça dans une fonction php qui me retourne un tableau sous la forme

    nom---- | id ---- | depth|
    cat 1 ---| 4 -----| 0
    cat1.1-- | 6 -----| 1
    cat 1.1.1 | 8 ----| 2
    cat1.2-- | 9 -----| 1
    cat2 ----| 5 -----| 0

    bien sur dans cet ordre puisque je dois l'afficher ainsi ...
    vous avez une idée de comment faire ça ? parce que là je sèche

    merci d'avance
    ++

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 248
    Par défaut
    Raah j'y suispresque mais j'arrive pas à calculer la profondeur ...

    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
    $tree = $db->aquery('select * from categorie');
     
    $refs = array();
     
    foreach ($tree as $t) {
        $thisref = &$refs[ $t->idCategorie ];
        $thisref['parent'] = $t->parent;
        $thisref['name'] = $t->nomCategorie;
    trace ($thisref);
     
        if ($t->parent == NULL) {
            $list[ $t->idCategorie ] = &$thisref;
        } else {
            $refs[ $t->parent ]['children'][ $t->idCategorie ] = &$thisref;
        }
    }
     
    trace ($refs, 'REFS');
     
    function tree ($refs, &$ok=array(), &$lvl=0) {
    	foreach ($refs as $k=>$v) {
     
    		if (!in_array($k, $ok)) {
     
    			echo $v['name'].'('.$lvl.')';
    			$ok[] = $k ;
    			echo '<br />';
     
    			if (isset($v['children'])) {
    				$lvl ++;
    				tree ($v['children'], $ok, $lvl );
    			} 
     
    		} 
     
    	}
    }
    tree ($refs);
    affiche

    Cat 1(0)
    cat 1.1(1)
    cat 1.1.1(2)
    cat 1.1.1(2)
    cat 1.2(2)
    cat 2(2)

    sauf que la profondeur (entre parentheses) n'est pas la bonne

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 248
    Par défaut
    Trouvé !

    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
    function tree ($refs, &$ok=array(), &$lvl=0) {
    	foreach ($refs as $k=>$v) {
     
    		if (!in_array($k, $ok)) {
     
    			if ($v['parent'] == null) {				
    				$lvl = 0;
    			}
     
    			echo $k. ' '.$v['name'].'('.$lvl.') - parent '.$v['parent'];
    			$ok[] = $k ;
    			echo '<br />';
     
    			if (isset($v['children'])) {				
    					$lvlsub = $lvl+1;										
    				//	echo '---TREE--<br />';
    					tree ($v['children'], $ok, $lvlsub);
    			} 
     
    		} 
     
    	}
    }
    celle là j'espère qu'elle servira à du monde !
    ++

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 248
    Par défaut
    la même avec une utilisation par référence

    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
     
    trace ($refs, 'REFS');
     
    function tree ($refs,&$r, &$ok=array(), &$lvl=0) {
    	foreach ($refs as $k=>$v) {
     
    		if (!in_array($k, $ok)) {
     
    			if ($v['parent'] == null) {				
    				$lvl = 0;
    			}
     
    		//	echo $k. ' '.$v['name'].'('.$lvl.') - parent '.$v['parent'];
     
    			$r[$k]['name'] = $v['name'];
    			$r[$k]['depth'] = $lvl;
    			$r[$k]['parent'] = $v['parent'];
     
    			$ok[] = $k ;
    		//	echo '<br />';
     
    			if (isset($v['children'])) {				
    					$lvlsub = $lvl+1;										
    				//	echo '---TREE--<br />';
    					tree ($v['children'], $r,$ok, $lvlsub);
    			} 
     
    		} 
     
    	}
     
    }
     
    $r = '';
     tree ($refs,$r);
     
    trace ($r,'R');

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 248
    Par défaut
    et la fonction trace dont je me sert ... en bonus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function trace($obj, $txt='') {
    	echo '<pre><strong>----------------------- '.$txt.' -----------------------</strong><br />';
    	print_r(var_dump($obj));
    	echo '</pre>';	
    }

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/06/2007, 12h17
  2. Rechercher un objet dans un tableau d'objet
    Par mikaelm dans le forum Ruby
    Réponses: 6
    Dernier message: 11/06/2007, 18h58
  3. Réponses: 1
    Dernier message: 05/03/2007, 11h39
  4. Probleme copie d'objet dans un tableau
    Par ché dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 13/12/2006, 13h15
  5. [Debutant] Stocker des objets dans un tableau à plusieurs indices
    Par Invité dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 27/09/2006, 19h04

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