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 :

Lire un tableau récursif


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 106
    Par défaut Lire un tableau récursif
    Bonjour,

    J'ai un tableau dans lequel se trouvent des éléments parents/enfants.

    Je tente de réaliser une fonction récursive pour gérer mes résultats mais je coince...

    Voici le tableau qu'il faut que je traite :
    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
    69
    70
    71
    Array
    (
        [0] => Array
            (
                [Calcul] => Array
                    (
                        [id] => 1
                        [nom] => Gros cacul maitre
                        [comptes] => 
                        [parent_id] => 
                        [groupe_id] => 3
                    )
     
                [children] => Array
                    (
                        [0] => Array
                            (
                                [Calcul] => Array
                                    (
                                        [id] => 2
                                        [nom] => Calcul moyen 2
                                        [comptes] => 238;301
                                        [parent_id] => 1
                                        [groupe_id] => 3
                                    )
     
                                [children] => Array
                                    (
                                        [0] => Array
                                            (
                                                [Calcul] => Array
                                                    (
                                                        [id] => 4
                                                        [nom] => Enfant du calcul moyen
                                                        [comptes] => 673;920;834
                                                        [parent_id] => 2
                                                        [groupe_id] => 3
                                                    )
     
                                                [children] => Array
                                                    (
                                                    )
     
                                            )
     
                                    )
     
                            )
     
                        [1] => Array
                            (
                                [Calcul] => Array
                                    (
                                        [id] => 3
                                        [nom] => Calcul moyen 2 encore
                                        [comptes] => 0
                                        [parent_id] => 1
                                        [groupe_id] => 3
                                    )
     
                                [children] => Array
                                    (
                                    )
     
                            )
     
                    )
     
            )
     
    )
    J'essaye de créer ma fonction qui dit qu'à chaque fois qu'un élément "children" est trouvé, la fonction se relance. Voici ce que j'ai réalisé :

    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
    function Childscalc($calculs){
    		foreach($calculs as $i => $calcul){
    			$result[][$i] = array('id' => $calcul['Calcul']['id'], 'nom' => $calcul['Calcul']['nom']);
     
     
    			if($calcul['children']){
    				$childs = $calcul['children'];
    				foreach($childs as $a => $child){
     
    					$result[$i]['childs']['calcul'][$a] = $child['Calcul']['nom'];
    					$result[$i]['childs']['calcul'][$a]['childs'] = array($this->Childscalc($child));
    				}
     
    		return $result;		
     
    			}
    Le but étant pour moi d'exploiter les numéros de comptes qui se trouve dans le tableau pour faire des requêtes. J'aimerais que le tableau me soit retourné un peu sous la même forme que mon premier tableau.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    regarde du coté de RecursiveArrayIterator

  3. #3
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Hello

    Ah enfin un cas d'usage des RecursiveIterator
    Je ne vois pas très bien ce que tu veux comme données de sortie mais bon, je vais essayer de te faire un exemple:
    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
     
    // On va utiliser une structure légèremenet différente
    // afin de pouvoir mettre des iterateur dessus
    $tab = array(
    	"id" => 1,
    	"nom" => "Gros Calcul Maitre",
    	"comptes" => null,
    	"parent_id" => null,
    	"group_id" => 3,
    	array(
    		"id" => 2,
    		"nom" => "Calcul Moyen",
    		"comptes" => "238,301",
    		"parent_id" => 1,
    		"group_id" => 1,
    		array(
    			"id" => 4,
    			"nom" => "Enfant du calcul moyen",
    			"comptes" => "673;920;834",
    			"parent_id" => 2,
    			"groupe_id" => 3,
    		),
    	),
    	array(
    		"id" => 3,
    		"nom" => "Calcul moyen 2 encore",
    		"comptes" => "0",
    		"parent_id" => 1,
    		"groupe_id" => 3,
    	),
    );
    On va faire un listing dessus histoire de rire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // On va créer la structure itrative correspondate:
    $itab = new RecursiveArrayIterator($tab);
     
    // On va faire le listing, pour y voir quelque chose
    $iitab = new RecursiveTreeIterator($itab);
     
    echo "Listing :\n";
    foreach ($iitab as $value)
    Produit:
    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
     
     
    Listing :
    |-1
    |-Gros Calcul Maitre
    |-
    |-
    |-3
    |-Array
    | |-2
    | |-Calcul Moyen
    | |-238,301
    | |-1
    | |-1
    | \-Array
    |   |-4
    |   |-Enfant du calcul moyen
    |   |-673;920;834
    |   |-2
    |   \-3
    \-Array
      |-3
      |-Calcul moyen 2 encore
      |-0
      |-1
      \-3
    Sexy non ? mais ce n'est pas ce qui nous intéresse pour l'instant.

    Voyons comment traverser cette structure maintenant:
    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
     
    $itab->rewind();
    while ($itab->valid())
    {
    	if ($itab->hasChildren())
    	{
    		echo "Children Found: ";
    		var_dump($itab->getChildren());
    	}
    	else
    	{
    		echo "Current: ";
    		var_dump($itab->current());
    	}
     
    	$itab->next();
    }
    Produit:
    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
     
    Traverser : Current: int(1)
    Current: string(18) "Gros Calcul Maitre"
    Current: NULL
    Current: NULL
    Current: int(3)
    Children Found: object(RecursiveArrayIterator)#4 (1) {
      ["storage":"ArrayIterator":private]=>
      array(6) {
        ["id"]=>
        int(2)
        ["nom"]=>
        string(12) "Calcul Moyen"
        ["comptes"]=>
        string(7) "238,301"
        ["parent_id"]=>
        int(1)
        ["group_id"]=>
        int(1)
        [0]=>
        array(5) {
          ["id"]=>
          int(4)
          ["nom"]=>
          string(22) "Enfant du calcul moyen"
          ["comptes"]=>
          string(11) "673;920;834"
          ["parent_id"]=>
          int(2)
          ["groupe_id"]=>
          int(3)
        }
      }
    }
    Children Found: object(RecursiveArrayIterator)#4 (1) {
      ["storage":"ArrayIterator":private]=>
      array(5) {
        ["id"]=>
        int(3)
        ["nom"]=>
        string(21) "Calcul moyen 2 encore"
        ["comptes"]=>
        string(1) "0"
        ["parent_id"]=>
        int(1)
        ["groupe_id"]=>
        int(3)
      }
    }
    Mmmh on s'approche.

    Tu n'as plus qu'a reproduire ton algo recursif sur cette structure et de parcourir à grand coups de next / previous / getChildren / hasChildren.

    Tout ce qui t'intéresse est là:http://www.php.net/manual/en/recursi...etchildren.php

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 106
    Par défaut
    Merci. Je vais étudier ça

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

Discussions similaires

  1. [Tableaux] Affichage d'un tableau récursif
    Par R'SKaP dans le forum Langage
    Réponses: 3
    Dernier message: 06/02/2007, 14h48
  2. Lire un tableau php
    Par hunzi dans le forum XMLRAD
    Réponses: 1
    Dernier message: 26/10/2006, 09h39
  3. Réponses: 9
    Dernier message: 02/08/2006, 11h31
  4. [Tableaux] lire un tableau de requete
    Par 18Marie dans le forum Langage
    Réponses: 2
    Dernier message: 22/06/2006, 21h00
  5. [Cookies] Stocker un tableau récursif dans un cookie
    Par Nizarazu dans le forum Langage
    Réponses: 8
    Dernier message: 25/05/2006, 20h56

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