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 :

Filtrer un array multi-niveau


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Rien
    Inscrit en
    Juillet 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Rien

    Informations forums :
    Inscription : Juillet 2021
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Filtrer un array multi-niveau
    Bonjour,

    Je possède un array qui représente des objects parent/enfant.

    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
     
    {
    "0": {
        "id": 2,
        "children": [
            {
                "id": 3,
                "children": []
            },
           ...
            {
                "id": 8,
                "children": []
            },
            {
                "id": 9,
                "children": [
                    {
                        "id": 50,
                        "children": []
                    }
                ]
            },
            ...
        ]
    },
    Je souhaite pouvoir filtrer ce tableau de manière à n'avoir que les élements parent correspondant à un ID donné.

    Ex: pour Id = 3 je dois avoir [2,3] et pour Id = 50 je dois avoir [50,9,2]

    J'ai beau réflechir est chercher sur le net je n'arrive pas à trouver une solution.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 234
    Points : 15 531
    Points
    15 531
    Par défaut
    vu qu'il y a plusieurs niveaux, je pense qu'il faut passer par une fonction récursive.

    par contre vous nous montrez l'arbre dans un format qui ressemble à du json, vous pouvez le convertir en tableau php ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Rien
    Inscrit en
    Juillet 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Rien

    Informations forums :
    Inscription : Juillet 2021
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Oui Oui je peut le convertir sans problème, cela est juste une sortie d'API, mais l'origine est un array.

    Je suis d'accord pour la fonction récursive, mais là je bloque complet sur un quelconque cheminement.

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Est-ce que l'id recherché doit forcément être au niveau d'une "feuille" du tableau multidimensionnel (autrement dit accompagné d'un children vide) ou bien cet id peut-être à n'importe quel niveau? Est-ce qu'un même id peut figurer plusieurs fois dans le tableau? Enfin, faut-il juste obtenir un tableau d'ids (représentant le chemin jusqu'à l'id recherché) ou faut-il vraiment "filtrer" le tableau d'origine?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 234
    Points : 15 531
    Points
    15 531
    Par défaut
    j'ai fait la fonction suivante, je ne sais pas si c'est optimisé mais ça produit le résultat que vous avez demandé :
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    $arbre = array (
      'id' => 2,
      'children' => 
      array (
        0 => 
        array (
          'id' => 3,
          'children' => 
          array (
          ),
        ),
        1 => 
        array (
          'id' => 8,
          'children' => 
          array (
          ),
        ),
        2 => 
        array (
          'id' => 9,
          'children' => 
          array (
            0 => 
            array (
              'id' => 50,
              'children' => 
              array (
              ),
            ),
          ),
        ),
      ),
    );
     
    aff(cherche(8, $arbre));
    aff(cherche(9, $arbre));
    aff(cherche(50, $arbre));
    aff(cherche(51, $arbre));
     
     
    function cherche($aiguille, $arbre, $chemin_trouve = [])
    {
     
    	$chemin_trouve[] = $arbre["id"];
     
     
    	if ($aiguille === $arbre["id"]) {
    		return $chemin_trouve;
    	}
     
     
    	if (count($arbre["children"]) > 0) {
     
    		foreach ($arbre["children"] as $enfant) {
     
    			$reponse = cherche($aiguille, $enfant, $chemin_trouve);
     
    			if (count($reponse) > 0) {
    				return $reponse;
    			}
     
    		}
     
    	}
     
    	// pas trouvé, retourne un tableau vide
    	return [];
     
    }
     
     
     
     
    function aff($var)
    {
    	echo "<pre>";
    	echo htmlspecialchars(var_export($var, TRUE));
    	echo "</pre>";
    }

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    @mathieu: tu peux enlever le test if (count($arbre["children"]) > 0) { car de toute manière la boucle foreach à l'intérieur ne sera pas exécutée si $arbre["children"] est vide.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. Array multi dimensionnelle et associative
    Par nico33307 dans le forum Langage
    Réponses: 6
    Dernier message: 09/05/2008, 07h05
  2. array multi niveau dans un form attaché a plusieurs modèles
    Par Acropole dans le forum Ruby on Rails
    Réponses: 0
    Dernier message: 23/12/2007, 15h33
  3. Réponses: 1
    Dernier message: 21/09/2007, 14h42
  4. Recherche de menu css multi-niveau
    Par lodan dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 09/02/2007, 21h46
  5. [Menu recherché] Vertical, multi-niveau, pas de frame
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/03/2006, 21h31

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