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 :

function pour lire une clef d'un json


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Par défaut function pour lire une clef d'un json
    Bonjour,

    Probleme avec ma function utilisée pour parcourir un json decode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $jsonFile = file_get_content('json.json');
    $json = json_decode($jsonFile);
    $find=KeySearch($json, 'bonjourajax');
     
    echo $find;
    Code php : 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
     
    // function permettant de trouver la valeur d'une key dans un json decode parexemple, 
    // seulement si cette key est unique dans l'objet
     
    function KeySearch($json, string $search)
    {
    	    foreach ($json as $key=>$val) {
     
                     // si c'est un array ou objet (stdclass) alors on parcoure l'objet
    	        if(is_array($val) || is_object($val)) {
    	            KeySearch($val, $search);
    	        }
     
    	        else if($key == $search) {
     
    			return $val;
                                   break;
    		}
    	    }
    	}

    La function ne marche que si je remplace return $val; par un echo $val; sinon elle ne retourne rien (pourquoi)
    Vous auriez une idée

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    C'est une fonction récursive avec un retour : il faut que tu retournes le retour de l'appel à la fonction à l'intérieur d'elle-même.
    ~~ Celira se relit, réalise que c'est incompréhensible, tente de reformuler, abandonne. ~~
    En bref :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function KeySearch($json, string $search)
    {
        foreach($json as $key => $val) {
            // si c'est un array ou objet (stdclass) alors on parcoure l'objet
            if (is_array($val) || is_object($val)) {
                return KeySearch($val, $search);
            }
            else if ($key == $search) {
                return $val;
            }
        }
    }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		else if($key == $search)
    Erreur de logique
    • il faut écrire elseif (sans espace)
    • il manque un return false; (par défaut)
    • il faut toujours écouter Celira


    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 KeySearch($json, string $search)
    {
    	foreach ($json as $key=>$val)
    	{
    		// si c'est un array ou objet (stdclass) alors on parcoure l'objet
    		if(is_array($val) || is_object($val)) {
    			return KeySearch($val, $search);
    		}
    		elseif($key == $search)
    		{
    			return $val;
    			break;
    		}
    	}
    	return false;
    }

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Et au passage, le break après le return $val ne sert à rien
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre chevronné
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Par défaut
    Bonsoir,

    merci pour vos réponses , cependant la function return toujours null


    Code php : 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 KeySearch($json, string $search)
    {
    	foreach ($json as $key=>$val)
    	{
    		// si c'est un array ou objet (stdclass) alors on parcoure l'objet
    		if(is_array($val) || is_object($val)) {
    			return KeySearch($val, $search);
    		}
    		elseif($key == $search)
    		{
    			return $val;
    		}
    	}
    	return false;
    }

    Je peux vous mettre le JSON en question si besoin
    Par contre si je ddeclare des variable global a l'intérieur de la function alors la ca marche..

    un moment ou ou elle fonctionne est lorsqu'elle est écrite de cette façon :

    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 KeySearch($json, string $search)
    {
    	foreach ($json as $key=>$val)
    	{
    		// si c'est un array ou objet (stdclass) alors on parcoure l'objet
    		if(is_array($val) || is_object($val)) {
    			KeySearch($val, $search);
    		}
    		elseif($key == $search)
    		{
    			echo $val;
    		}
    	}
    	return false;
    }
    edit: le json en question:

    Code json : 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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    {
    	"id": "evt_1CWxfoFa1jDYIR5sI7",
    	"object": "event",
    	"api_version": "2018-01-23",
    	"created": 1527561296,
    	"data": {
    		"object": {
    			"id": "in_1CWxfoFa1jDYlf8FCEJExQir",
    			"object": "invoice",
    			"amount_due": 255,
    			"amount_paid": 255,
    			"amount_remaining": 0,
    			"application_fee": null,
    			"attempt_count": 0,
    			"attempted": true,
    			"billing": "charge_automatically",
    			"billing_reason": "subscription_update",
    			"charge": "ch_1CWxfoFa1jDYlf8",
    			"closed": true,
    			"currency": "eur",
    			"customer": "cus_CwrOrgzt",
    			"date": 1527561298,
    			"description": null,
    			"discount": null,
    			"due_date": null,
    			"ending_balance": 0,
    			"forgiven": false,
    			"lines": {
    				"object": "list",
    				"data": [{
    					"id": "bonjourajax",
    					"object": "line_item",
    					"amount": 199,
    					"currency": "eur",
    					"description": "bonjourajax",
    					"discountable": true,
    					"livemode": false,
    					"metadata": {},
    					"period": {
    						"end": 1528166096,
    						"start": 1527561296
    					},
    					"plan": {
    						"id": "plan_Cwq7FlNCg67vlH",
    						"object": "plan",
    						"aggregate_usage": null,
    						"amount": 199,
    						"billing_scheme": "per_unit",
    						"created": 1527556563,
    						"currency": "eur",
    						"interval": "week",
    						"interval_count": 1,
    						"livemode": false,
    						"metadata": {},
    						"name": "bonjourajax",
    						"nickname": "bonjourajax",
    						"product": "prod_Cwq61rkVXdzs6g",
    						"statement_descriptor": null,
    						"tiers": null,
    						"tiers_mode": null,
    						"transform_usage": null,
    						"trial_period_days": null,
    						"usage_type": "licensed"
    					},
    					"proration": false,
    					"quantity": 1,
    					"subscription": null,
    					"subscription_item": "si_CwrOpVbqyr5q6b",
    					"type": "subscription"
    				}],
    				"has_more": false,
    				"total_count": 1,
    				"url": "\/v1\/invoices\/in_1CWxfoFa1jDYlf8FCEJExQir\/lines"
    			},
    			"livemode": false,
    			"metadata": {},
    			"next_payment_attempt": null,
    			"number": "89CCF50-0001",
    			"paid": true,
    			"period_end": 1527561296,
    			"period_start": 1527561296,
    			"receipt_number": null,
    			"starting_balance": 0,
    			"statement_descriptor": null,
    			"subscription": "sub_CwrOB8kr4KLVf8",
    			"subtotal": 199,
    			"tax": null,
    			"tax_percent": null,
    			"total": 199,
    			"webhooks_delivered_at": null
    		}
    	},
    	"livemode": false,
    	"pending_webhooks": 1,
    	"request": {
    		"id": "req_l9nGAtGgSjwX5B",
    		"idempotency_key": null
    	},
    	"type": "invoice.payment_succeeded"
    }

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 994
    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 994
    Par défaut
    On ne peut pas écrire return KeySearch(...) dans la fonction, car au premier tableau ou objet rencontré la fonction s'interrompra (que la clef soit trouvée ou non) sans avoir parcouru le reste des clefs. Le seul appel de fonction qui devrait pouvoir retourner une valeur est l'appel qui ne soit pas récursif.

    Par exemple, en utilisant des variables statiques, on peut faire:
    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
    function keySearch($haystack, $needle) {
        static $result = [];
        static $level = 0;
     
        foreach($haystack as $key => $value) {
            if ($key === $needle)
                $result[] = $value;
     
            if ( is_array($value) || is_object($value) ) {
                $level++;
                keySearch($value, $needle);
                $level--;
            }
        }
     
        if ( !$level )
            return $result;
    }
     
    print_r(keySearch($json, 'uneclef'));
    Cette fonction cherche toutes les occurrences de la clef et stocke les valeurs (quel quelles soient) dans un tableau qui est ensuite retourné.

    Si on part du principe que la clef est unique et que par économie on veuille s'arrêter dés que la clef correspond, on pourrait écrire quelque chose comme:
    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 keySearch($haystack, $needle) {
        static $found = false;
     
        foreach($haystack as $key => $value) {
            if ($key === $needle) {
                $found = true;
                return $value;
            }
     
            if ( is_array($value) || is_object($value) ) {
                $result = keySearch($value, $needle);
                if ( $found )
                    return $result;
            }
        }
    }
    Mais ce code pose problème! Car il est impossible de savoir si la fonction renvoie NULL parce qu'elle n'a pas trouvée la clef ou parce que c'est la valeur de la clef. (Le même problème se posera si on choisit de renvoyer false ou 0). On peut solutionner ce problème en réécrivant la fonction de manière à ce quelle renvoie true ou false et en passant la variable du résultat par référence.


    Si le but est de ne retourner ni les objets, ni les tableaux, dans ce cas inutile de se casser la tête, il suffit de décoder le json en tableau multidimensionnel ($json = json_decode($text, true);) puis de parcourir les "feuilles" avec array_walk_recursive.

  7. #7
    Membre chevronné
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Par défaut
    Bonsoir CosmoKnacki
    Merci.
    Apres avoir essayé vos codes le 1er marche tres bien et le deuxieme renvoi un
    Catchable fatal error: Object of class stdClass could not be converted to string

    Je galère pour la lecture de valeur ciblé d'un json en PhP, c'est pour cela que j'ai essayé de créer une function, basée sur un simple var_dump(json_decode($j));
    Pouvez vous m'expliquer davantage vos solutions, merci

    (et par exemple si je veux seulement la clef "start" du json ci dessus comment dois je m'y prendre sans function?
    j'avais essayé un echo $json->data->object->lines->data[0]->period[0]->start qui evidemment ne marche pas)

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

Discussions similaires

  1. sizeof dans une fonction pour lire une chaine
    Par Haze. dans le forum Débuter
    Réponses: 11
    Dernier message: 06/11/2007, 13h07
  2. Problème pour lire une datatable
    Par kikitx dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/08/2007, 21h19
  3. Gros problème pour lire une vidéo
    Par zoidy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 06/06/2006, 13h35
  4. [XHTML] Balise OBJECT pour lire une vidéo...
    Par zoidy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 02/06/2006, 11h21
  5. Pb pour lire une video
    Par polevault dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 09/01/2006, 01h21

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