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 :

Assignation et comparaison de type


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 56
    Points : 28
    Points
    28
    Par défaut Assignation et comparaison de type
    Bonjour !

    A force de vouloir nous simplifier la vie, PHP finit aussi par agir différemment de ce qu'on peut attendre de lui. Mais peut être que je ne connais juste pas la parade...

    Bien qu'il soit peu utile de le rappeler, une assignation en php renvoie la valeur booléene du membre de gauche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $b = array('pomme', 'poire', 'tomate');
    if($a = in_array('pomme', $b))
       echo (int)$a;
    Ce code affiche '1'.

    C'est cool, même si ça sert a rien ici.

    Problème ! La valeur de retour d'une assignation '=' est convertie implicitement en booléen. Pratique la plupart du temps.

    Mais dans mon cas, ça casse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $b = array('pomme', 'poire', 'tomate');
    if($a = array_search('pomme', $b))
       echo (int)$a;
    Rien... Car array_search me renvois l'integer '0', qui une fois casté en booleen vaut False.

    Est-ce que quelqu'un aurait une solution ? (sans rajouter de ligne hein, pas compliqué de passer outre ce soucis, c'est juste pour le fun)

    La moins pire solution que j'ai trouvé pour l'instant c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $b = array('pomme', 'poire', 'tomate');
    if($a = (string)array_search('pomme', $b)||$a==='0')
       echo (int)$a;
    Ou alors pour ce cas plus spécifique, il existe peut être une autre fonction de tableau qui permet de combiner un array search et un in_array sans poser ce soucis ?

    Je sais, pas très productif comme recherche de code, mais pour le coup, j'aurais bien aimé avoir un opération d'assignation qui me renvoit un booléen avec vérification du type. '====' un jour ?

  2. #2
    Membre actif Avatar de buse974
    Homme Profil pro
    Développeur / Chef de projet informatique
    Inscrit en
    Février 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Février 2007
    Messages : 117
    Points : 245
    Points
    245
    Par défaut
    salut,

    enfaite je n'est pas bien compris ce que tu recherche a faire, tu attend que ta variable $a te retourne quoi en fonction de quoi ?

    car quand tu dit au debut


    C'est cool, même si ça sert a rien ici.
    ben dans l'immédiat cela sert a te dire que pomme et bien dans ton tableau, donc la fonction te renvoie 1 (true), mais si ce n'est pas ce que tu recherche a faire, ben ouai je suis daccord.

    Et pareil pour

    il te renvoie 0 qui et la position 0 de pomme dans ton tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    0 => "pomme", 1=> "poire", 2 => "tomate"
    Donc juste un peut plus de précision sur le but de la manoeuvre serai la bien venu

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 56
    Points : 28
    Points
    28
    Par défaut
    Le in_array en exemple servait juste à illustrer le fait que une assignation renvoi la valeur booléenne du membre de gauche (ici $a)

    Par contre le array_search lui...

    array_search permet de renvoyer la clef d'une valeur.

    Si cette valeur existe dans le tableau, il renvoit la clef, si elle n'existe pas, il renvoit false.

    J'ai un tableau $b, je veux savoir si la valeur que je cherche est dans ce tableau et si oui, connaitre sa clef.

    En théorie, le code donné en exemple 2 permet de faire cela. Car soit $a vaut une clef, soit il vaut false.

    Exception faite du cas problématique : Si la clef renvoyée est 0, PHP cast ce 0 en booléen qui vaut alors FALSE pour la structure 'if'

    Dans ma solution (moche), je cast la clef renvoyée par array_search en string, et vérifie ensuite que, si la valeur de $a est 0 et que c'est un string, l'expression complète soit vérifiée. (le === permet de vérifier la valeur+le type). De fait seul un véritable 'FALSE' renvoyé par array_search peut empêcher de vérifier l'expression.

    L'idéal (et je ne sais pas si c'est possible) aurait été d'écrire (j'invente un opérateur hein :p)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $b = array('pomme', 'poire', 'tomate');
    if($a =+=== array_search('pomme', $b))
       echo (int)$a;
    bref, de faire une assignation (comme pour '=' )dont le retour n'est pas sa valeur castée en boolean, mais juste sa valeur, ou alors sa valeur+la vérification du type (comme pour l'opérateur '===')

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 56
    Points : 28
    Points
    28
    Par défaut
    Ahhh j'ai trouvé ! Enfin je pense avoir trouvé, si quelqu'un a encore mieux, j'écoute !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $b = array('pomme', 'poire', 'tomate');
    if(!(FALSE === $a = array_search('pomme', $b)))
       echo $a;
    EDIT : encore mieux :p (connaissais pas cet opérateur)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $b = array('pomme', 'poire', 'tomate');
    if(FALSE !== $a = array_search('pomme', $b))
       echo $a;

Discussions similaires

  1. Comparaison de Type d'un string
    Par lasrevinu dans le forum C#
    Réponses: 10
    Dernier message: 28/04/2010, 09h58
  2. Comparaison date type AaAa-Mm
    Par justin92330 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/07/2008, 17h50
  3. [Free Pascal] [2.2] Impossible d'assigner une variable de type T à une variable de type T
    Par Hibou57 dans le forum Free Pascal
    Réponses: 3
    Dernier message: 12/10/2007, 12h31
  4. Assigné des Canvas de type différents.
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 12
    Dernier message: 06/07/2007, 12h14
  5. Switch/case et comparaison de type gt/lt
    Par sroux dans le forum Langage
    Réponses: 7
    Dernier message: 28/08/2006, 09h48

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