Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
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 11/03/2011, 20h50   #1
Invité régulier
 
Romain
Inscription : septembre 2010
Messages : 15
Détails du profil
Informations personnelles :
Nom : Romain

Informations forums :
Inscription : septembre 2010
Messages : 15
Points : 5
Points : 5
Par défaut Boucle Foreach et manipulation d'array

Bonsoir,

je viens vers vous car me voilà bloqué avec une boucle foreach... je ne sais pas comment la manipuler correctement.

Voila ma problématique :

Je manipule des catégories (d'article) classées hiérarchiquement.

Dans un array sont stockées les ID de catégories (d'article) auxquel sont associé leur parent.

Pour faire simple, petit schéma :

Code :
1
2
3
4
5
6
7
 
1        --> Catégorie maitre (pas de parent)
=2      --> Sous catégorie (à pour parent 1)
=3      --> Sous catégorie 
==5    --> Sous-sous catégorie (à pour parent 3)
=4      --> Sous catégorie
==6    --> Sous-sous  catégorie (à pour parent 4)
C'est stocké dans mon array comme ceci :
[id] => parent

Code :
1
2
 
$arrayInit = Array ( [1] => 0 [2] => 1 [3] => 1 [4] => 1[5] => 3 [6] => 4);
Je souhaite connaitre les tous enfants d'un ID donné ($var) selon une profondeur donnée ($profondeur) et que cela s'adapte a n'importe quel profondeur de hiérarchie.

Si $var = 1 et profondeur='all' alors mon résultat -> array(2,3,4,5,6)
Si $var = 1 et profondeur=1 alors mon résultat -> array(2,3,4)
Si $var = 3 et profondeur=1 alors mon résultat -> array(5)

Je sais que je dois utiliser plusieurs array "temporaire" mais ne sait pas ou les placer.

Voilà mes avancées.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
$arrayTemp = array();
 
for($i=0;$i < $profondeur;$i++) { 
    foreach($arrayInit as $row => $valeur)
    {
        if($i == 0) $valeurTest = $var;
        else  $valeurTest = $reschild[$i-1]; 						
 
         if ($valeur ==  $valeurTest) 
         {
         array_push($arrayFinal,$row);
         array_push($arrayTemp,$row);
         }	
     } 
}
print_r($arrayFinal);
Je me perd dans toutes ces boucles et n'arrive plus a savoir comment faire.
D'avance je vous remercie de votre aide.
rom1dvp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 20h54   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
http://www.developpez.net/forums/d10...ion-recursive/
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 21h31   #3
Invité régulier
 
Romain
Inscription : septembre 2010
Messages : 15
Détails du profil
Informations personnelles :
Nom : Romain

Informations forums :
Inscription : septembre 2010
Messages : 15
Points : 5
Points : 5
Allez j'essaye :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<? 
$arrayInit = Array (1 => 0, 2 => 1, 3 => 1, 4 => 1, 5 => 3, 6 => 4);
$tree = array();
$var = 1;
$profondeur = 1;
 
foreach($arrayInit as $row=> $value)
{
    if($value == $var)   array_push($tree,$row);
}
print_r($tree);
?>
ça fonctionne !

Maintenant plus dur, avec $profondeur=2

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
<? 
$arrayInit = Array (1 => 0, 2 => 1, 3 => 1, 4 => 1, 5 => 3, 6 => 4);
$tree = array();
$var = 1;
$profondeur = 2;
 
for($i=0;$i < $profondeur ;$i++) { 
 
	foreach($arrayInit as $row=> $value)
	{
		if($value == $var)   array_push($tree,$row);
	}
 
	foreach($tree as $row2=> $value2)
	{
		if($arrayInit[$row2] == $row2)  array_push($tree,$arrayInit[$row2]);
	}
 
}
print_r($tree);
?>

Voilà, je m'embrouille les pinceaux... je suis sur la bonne voie ?
rom1dvp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 23h37   #4
Invité régulier
 
Romain
Inscription : septembre 2010
Messages : 15
Détails du profil
Informations personnelles :
Nom : Romain

Informations forums :
Inscription : septembre 2010
Messages : 15
Points : 5
Points : 5
voila la solution, merci à ThomasR sur le chat qui me la suggérer après de nombreux test !

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
<? function get_children($categories_list, $id_categorie, $profondeur){
    $children = array();
 
	foreach($categories_list as $id => $id_parent){
 
		if($id_parent === $id_categorie){
            $children[] = $id;
 
			if($profondeur > 1 || $profondeur === 'ALL'){
                $children = array_merge($children, get_children($categories_list, $id, $profondeur - 1));    
            }
        }
    }
    return $children;
}
 
$arrayInit = Array (
    1 => 0, 
    2 => 1, 
    3 => 1, 
    4 => 1, 
    5 => 3, 
    6 => 4,
	7 => 6,
	8 => 6
);
 
$tree = array();
$var = 1;
$profondeur = 3;
 
print_r(get_children($arrayInit, $var, $profondeur)); 
//$mycategories = get_children($arrayInit, $id_categorie, 'ALL');
?>
Merci stealth35 pour tes pistes !
rom1dvp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2011, 02h45   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
je regarderai de plus prés c'est toujours mieux de faire du l'itératif que du récursif (mais si ca marche t'en mieux)
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2011, 03h45   #6
Invité régulier
 
Romain
Inscription : septembre 2010
Messages : 15
Détails du profil
Informations personnelles :
Nom : Romain

Informations forums :
Inscription : septembre 2010
Messages : 15
Points : 5
Points : 5
je ne demande qu'a apprendre... se sera avec plaisir que j'analyserai le morceau de code si tu as le temps d'y jeter un coup d'oeil.
rom1dvp 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 00h22.


 
 
 
 
Partenaires

Hébergement Web