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 :

JSONPATH ou recherche recursive


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 174
    Points : 113
    Points
    113
    Par défaut JSONPATH ou recherche recursive
    J’ai un fichier JSON que je veux manipuler avec PHP il retourne un tableau multi dimension voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $jsonString = file_get_contents('tree.json');
     
    $data = json_decode($jsonString, true);
    Quand je fais un dump sur $data j'obtiens cette résultat
    Nom : 45.png
Affichages : 156
Taille : 12,6 Ko
    Je cherche une manière pour rechercher un élément par sa valeur j'ai trouvé une solution pour faire une recherche par attribut on utilisant Library JSONPATH mais je veux filtrer par valeur chose qui ne fonctionne pas j'ai testé 2 solution qui ne fonctionne pas

    1) Utilisation de Jsonpath voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $o = $parser->decode($json);
    jsonPath($o, "$..[?(@.text == MA1 Processus Pilotage)]");
    2) Fonction recursive
    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
    	function srch($array,$target){
    		$path= "";
    		foreach ($array as $key => $value) {
    			 	if(is_array($value)){               
    			$path = srch($value,$target);
    			if($path != ""){                      
    				$path =  "[".$key."]".$path;
    			}
    		}else{                                    
    			if($value == $target){                  
    				$path = "[".$key."]";              
    			}
    		}
    	}
    	return $path;
    merci de m'aider

  2. #2
    Membre éclairé Avatar de Geoffrey74
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 515
    Points : 760
    Points
    760
    Par défaut
    Salut,

    je ne suis pas sur d'avoir tout saisie, tu chercher à savoir si une valeur est présente dans ton tableau ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function recursive_array_search($ValeurDeRecherche,$Tableau) {
        foreach($Tableau as $key=>$value) {
            $current_key=$key;
            if($ValeurDeRecherche===$value OR (is_array($value) && recursive_array_search($ValeurDeRecherche,$value) !== false)) {
                return $current_key;
            }
        }
        return false;
    }
    Cela te retourne la clé associée à la valeur si elle est présente.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 174
    Points : 113
    Points
    113
    Par défaut
    Merci beaucoup pour votre réponse mais le script ne renvoie pas la position complète il affiche seulement la position du parent
    exemple
    si je cherche GP:Application gestion paie je dois avoir 4,nodes,0,text le script renvoie seulement 4

  4. #4
    Membre éclairé Avatar de Geoffrey74
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 515
    Points : 760
    Points
    760
    Par défaut
    Il est possible de modifier le script, en créant un array de clés courantes en fonction de la position dans le tableau.

    A chaque fois que tu rentres dans une dimension du tableau, tu stock la clé, et le niveau, dans un tableau, et si la valeur est trouvée, tu retournes l'array complet.

  5. #5
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Bonjour,
    La fonction initiale devrait être correcte en ajoutant des "break" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    $path="[".$key."]".$path;
    break;
    ...
    $path="[".$key."]";
    break;
    Par ailleurs, la comparaison stricte serait préférable :
    Enfin, il resterait à traiter le cas où une valeur apparaît plusieurs fois, comme c'est le cas sur l'image.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 174
    Points : 113
    Points
    113
    Par défaut
    Merci pour vos réponses voici une solution fonctionnelle pour mon cas.
    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 srch($array,$target){
        $path= "";
        foreach ($array as $key => $value) {
            if(is_array($value)){               
                $path = srch($value,$target);
                if($path != ""){                      
                    return $path =  "[".$key."]".$path;
                }
            }else{                                    
                if($value == $target){                  
                    return $path = "[".$key."]";              
                }
            }
        }
        return "";                               
    }

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

Discussions similaires

  1. Recherche recursive sur tous les disques
    Par cellendhyll dans le forum Général Python
    Réponses: 13
    Dernier message: 15/12/2009, 14h19
  2. recherche recursive de fichier par extension-date-heure
    Par grundraisin dans le forum VBScript
    Réponses: 10
    Dernier message: 16/09/2009, 12h48
  3. Recherche Recursive Depuis chaines de caractères
    Par quentingsc dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 07/12/2006, 18h56
  4. Ksh, recherche récursive
    Par Soria17 dans le forum Linux
    Réponses: 9
    Dernier message: 15/11/2006, 18h45
  5. Recherche recursive à l'aide des expressions reguliére
    Par titoff dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/12/2005, 16h42

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