Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/01/2011, 13h06   #1
Membre du Club
 
Inscription : janvier 2009
Messages : 98
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 98
Points : 44
Points : 44
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 :
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 :
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.
flashnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 13h40   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
regarde du coté de RecursiveArrayIterator
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 13h56   #3
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
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 :
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 :
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 :
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 :
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 :
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
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 21h09   #4
Membre du Club
 
Inscription : janvier 2009
Messages : 98
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 98
Points : 44
Points : 44
Merci. Je vais étudier ça
flashnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h29.


 
 
 
 
Partenaires

Hébergement Web