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

PHP & Base de données Discussion :

in_array / array_keys : résultats incohérents (casse-tête !) [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Billets dans le blog
    27
    Par défaut in_array / array_keys : résultats incohérents (casse-tête !)
    Bonjour,

    Malgré moultes tests et avoir cherché / retourné le problème dans tous les sens, je ne comprends pas les résultats que me retourne PHP pour une bête opération logique (ce qui a le don de m'exaspérer au passage ! )

    Fatigue ? Proche du pont ?

    Si quelqu'un peut m'aider sur ce mystérieux et insondable problème... ! D'avance merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $Infos = json_decode($Quelquechose,true); 
    if ($Infos==false) 
    	return false; 
    if (!in_array(array_keys($Infos),array('action','type','id'))) 
    	return ' non ! '; 
    return ' oui ! ';
    Résultat : non !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $Infos = json_decode($Quelquechose,true); 
    if ($Infos==false) 
    	return false; 
    if (!in_array(array('action','type','id'),array_keys($Infos))) 
    	return ' non ! '; 
    return ' oui ! ';
    Résultat : non !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $Infos = json_decode($Quelquechose,true); 
    if ($Infos==false) 
    	return false; 
    if (array_keys($Infos) == array('action','type','id')) 
    	return ' non ! '; 
    return ' oui ! ';
    (Sachant que la structure du JSON est identique en tout point hein...)
    Résultat : oui !

    Si je fais un var_dump sur les deux tableaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    array(3) { [0]=> string(6) "action" [1]=> string(4) "type" [2]=> string(2) "id" } 
    array(3) { [0]=> string(6) "action" [1]=> string(4) "type" [2]=> string(2) "id" }
    WTF ?! Pourquoi diable le in_array ne me retrouve pas l'existence des valeurs d'un des tableaux dans l'autre ?!

    ... Pour l'instant je fais du moche et cracra :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (
    !in_array('action',array_keys($Infos)) OR 
    !in_array('type',array_keys($Infos)) OR 
    !in_array('id',array_keys($Infos)) 
    )

  2. #2
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    question pourquoi tu utilise in_array sur array_keys?
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {
      if(sizeof(array_keys($Infos,array('action','type','id')))>0)
        return 'oui'
      else
        return 'non';
    }

  3. #3
    Membre Expert
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Billets dans le blog
    27
    Par défaut
    Très simple : j'ai une chaîne JSON qui provient de l'utilisateur. Je dois savoir si elle a les trois paramètres minimales pour la fonction ("action", "type", "id").

    Ma chaîne JSON décodée est un tableau où je vérifie l'existence de ces trois clés en les extrayant du tableau et en regardant si ça correspond au tableau de clés minimales à avoir.

    Je ne m'occupe pas de savoir ce que contient la valeur associée à la clé.

    Normalement, si les deux correspondent (et c'est le cas lorsque je passe par une comparaison "brute"), tout devrait bien se passer.

    Or là, clairement, y a un bug : le array_keys me sort un tableau en tout point identique à celui que je devrais avoir (j'ai vérifié par le var_dump), mais il me ressorte un FALSE.... !

    Je ne comprends pas ce retour : il devrait être positif !

  4. #4
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    array_keys te permet justement ça vu que tu peux chercher une ou plusieurs valeurs parmi les clés du tableau...
    après tu as juste à regarder la taille du tableau retourné...
    si tu veux savoir si au moins une des clés est présente alors la taille devra être supérieure à 0...
    si tu veux savoir si toute les clés sont présentes alors tu regardes si la taille équivaut au nombre de clés...

    pas besoin de passer par un in_array... lui sert à voir si une valeur est présente dans un tableau...toutes les fonctions sur les tableaux ont un paramètre pour gérer si on teste en mode strict ou pas ce qui change le résultat (en tenant compte de l'ordre et/ou du type des données)

    as tu essayé ma solution?

  5. #5
    Membre Expert
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Billets dans le blog
    27
    Par défaut
    Je la comprends parfaitement mais elle ne répond pas à mon besoin. Car derrière la clé, il y a une valeur.

    Je vérifie ici juste si la clé existe, mais parce que je récupère après la valeur.

    D'où la nécessité pour moi non pas de savoir si $Infos contient trois entrées (et donc trois clés), mais s'il y a bien les trois clés demandés : d'où l'utilisation de array_keys.

    Aussi in_array me semble le plus intéressant car il doit trouver un needle ou un tableau dans un autre ; c'est-à-dire exactement ce que je souhaite.

    Je persiste à croire qu'il y a un bug car sur le papier, il n'y a rien qui justifie un FALSE, d'autant qu'une comparaison brute entre les deux tableaux me renvoie bien TRUE !!

  6. #6
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Attention : si tu utilises un tableau comme élément à rechercher dans in_array, la fonction va chercher le tableau comme élément du tableau cible.
    Bref, ça fonctionne pour un cas de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?
    $tab = array(
        1 => array('chocolat', 'vanille', 'fraise'),
        2 => array('café', 'caramel', 'chocolat')
        );
    in_array(array('chocolat', 'vanille', 'fraise'), $tab));
    Toi, ce que tu cherches, c'est plutôt quelque chose qui vérifie que plusieurs valeurs sont présentes dans le même tableau. in_array ne permet pas ce genre de choses.

    Il est possible de faire quelque chose avec array_intersect ou array_diff.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $needle = array('action','type','id');
    $haystack = arrays_keys($Infos);
    if (count(array_diff($needle, $haystack)) === 0) {
     // tout trouvé !
    }
    @eric : le problème de ton idée, c'est que ça va marcher aussi si tu as 2 tableaux avec le même nombre de valeurs, mais des valeurs totalement différentes. Je ne crois pas que ce soit le but recherché.
    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]

  7. #7
    Membre Expert
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Billets dans le blog
    27
    Par défaut
    Citation Envoyé par Celira Voir le message
    Attention : si tu utilises un tableau comme élément à rechercher dans in_array, la fonction va chercher le tableau comme élément du tableau cible. (...)
    Toi, ce que tu cherches, c'est plutôt quelque chose qui vérifie que plusieurs valeurs sont présentes dans le même tableau. in_array ne permet pas ce genre de choses.
    Ah ok... j'avais lu la doc, mais j'avoue ne pas avoir compris cette subtilité. Je pensais à un array_map, avec une recherche successive et un retour global soit à TRUE pour tout trouvé, ou FALSE s'il en manquait un.

    Effectivement un croisement de tableau me suffit !

    Merci à tous les deux !

  8. #8
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Je dois avouer que j'aurais probablement fait la même erreur (si j'avais su qu'on pouvait passer un tableau en tant qu'élément recherché dans in_array, ce que j'ignorais) et que j'ai dû relire l'exemple 3 fois pour être sûre d'avoir bien compris
    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]

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

Discussions similaires

  1. [Tableaux] Casse têtes de boucles
    Par Anduriel dans le forum Langage
    Réponses: 5
    Dernier message: 28/06/2006, 00h24
  2. requête SQL un peu casse tête
    Par hellbilly dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/12/2005, 10h03
  3. Classe, pile, pointeurs et casse-tête!
    Par zazaraignée dans le forum Langage
    Réponses: 6
    Dernier message: 26/09/2005, 16h57
  4. casse-tête excel
    Par gregius dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2005, 16h38
  5. Résultat incohérent de pow, sqrt
    Par PierrotY dans le forum C++
    Réponses: 15
    Dernier message: 16/03/2005, 12h07

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