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 :

Boucle Foreach et manipulation d'array


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 18
    Points : 17
    Points
    17
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
    $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.

  2. #2
    Expert éminent sénior

    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
    Points : 10 726
    Points
    10 726

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Allez j'essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
    <? 
    $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 ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    voila la solution, merci à ThomasR sur le chat qui me la suggérer après de nombreux test !

    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
    <? 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 !

  5. #5
    Expert éminent sénior

    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
    Points : 10 726
    Points
    10 726
    Par défaut
    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)

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    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.

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

Discussions similaires

  1. [MySQL] Requêtes UPDATE dans boucles foreach avec array
    Par vinceom92 dans le forum PHP & Base de données
    Réponses: 67
    Dernier message: 16/03/2014, 21h29
  2. Utiliser 2 array pour une boucle foreach()
    Par boubz013 dans le forum Langage
    Réponses: 3
    Dernier message: 13/10/2010, 18h41
  3. [C# VS 2005] Collection et boucle foreach
    Par SDragon dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/07/2006, 19h43
  4. [C# 1.1]Boucles foreach imbriquees
    Par Nip dans le forum Windows Forms
    Réponses: 12
    Dernier message: 13/04/2006, 16h35
  5. [Tableaux] la boucle foreach
    Par jeanfrancois dans le forum Langage
    Réponses: 7
    Dernier message: 09/03/2006, 17h29

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