114 votes

Jonglage entre les types et comparaisons (strictes) plus grand/moins grand en PHP

PHP est célèbre pour sa capacité à jongler avec les types. Je dois admettre que cela me laisse perplexe, et que j'ai du mal à trouver des choses logiques/fondamentales dans les comparaisons.

Par exemple : Si $a > $b est vrai et $b > $c est vrai, cela doit-il signifier que $a > $c es toujours vrai aussi ?

En suivant la logique de base, je dirais oui Cependant, je suis tellement perplexe que je ne fais pas vraiment confiance à PHP dans ce domaine. Peut-être quelqu'un peut-il fournir un exemple où ce n'est pas le cas ?

Je me demande également si, avec les opérateurs inférieur et supérieur stricts (car leur signification est décrite comme stricte, ce que je ne connaissais que par les comparaisons d'égalité), cela fait une différence si les opérandes gauche et droit sont échangés avec des valeurs strictement inégales :

# Precondition:
if ($a === $b) {
    throw new Exception(
       'Both are strictly equal - can not compare strictly for greater or smaller'
    );
}

($a > $b) !== ($b > $a)

Pour la plupart des combinaisons de comparaison de types, ces opérateurs de comparaison plus grand / plus petit ne sont pas documentés, donc la lecture du manuel n'a pas été vraiment utile dans ce cas.

206voto

NikiC Points 47270

Les opérateurs de comparaison de PHP s'écartent des définitions informatiques de plusieurs façons :

Afin de constituer un relation d'équivalence == doit être réflexif, symétrique et transitif :

  • PHP == L'opérateur est non réflexif c'est-à-dire $a == $a n'est pas toujours vrai :

    var_dump(NAN == NAN); // bool(false)

    Note : Le fait que toute comparaison impliquant NAN est toujours false n'est pas spécifique à PHP. Il est imposé par le standard IEEE 754 pour l'arithmétique à virgule flottante ( plus d'infos ).

  • PHP == L'opérateur est symétrique c'est-à-dire $a == $b y $b == $a sont toujours les mêmes.

  • PHP == L'opérateur est non transitif c'est-à-dire de $a == $b y $b == $c fait no suit $a == $c :

    var_dump(true == "a"); // bool(true)
    var_dump("a" == 0);    // bool(true)
    var_dump(true == 0);   // bool(false)

Afin de constituer un ordre partiel <= / >= doit être réflexif, anti-symétrique et transitif :

  • PHP <= L'opérateur est non réflexif c'est-à-dire $a <= $a n'est pas toujours vrai (exemple identique à celui de == ).

  • PHP <= L'opérateur est pas anti-symétrique c'est-à-dire de $a <= $b y $b <= $a ne suit pas $a == $b :

    var_dump(NAN <= "foo"); // bool(true)
    var_dump("foo" <= NAN); // bool(true)
    var_dump(NAN == "foo"); // bool(false)
  • PHP <= L'opérateur est non transitif c'est-à-dire de $a <= $b y $b <= $c ne suit pas $a <= $c (Exemple identique à celui de == ).

  • Extra : PHP <= L'opérateur est non total c'est-à-dire que les deux $a <= $b y $b <= $a peut être fausse :

    var_dump(new stdClass <= new DateTime); // bool(false)
    var_dump(new DateTime <= new stdClass); // bool(false)

Afin de constituer un Ordre partiel strict < / > doit être irréfléchi, asymétrique et transitif :

  • PHP < L'opérateur est irréflexif c'est-à-dire $a < $a n'est jamais vrai. Notez que c'est vrai seulement à partir de PHP 5.4 . Précédemment INF < INF évalué à true .

  • PHP < L'opérateur est non asymétrique c'est-à-dire de $a < $b ne suit pas !($b < $a) (Exemple identique à celui de <= n'étant pas antisymétrique).

  • PHP < L'opérateur est non transitif c'est-à-dire de $a < $b y $b < $c ne suit pas $a < $c :

    var_dump(-INF < 0);    // bool(true)
    var_dump(0 < TRUE);    // bool(true)
    var_dump(-INF < TRUE); // bool(false)
  • Extra : PHP < L'opérateur est non trichotomique c'est-à-dire tous les $a < $b , $b < $a y $a == $b peut être fausse (exemple identique à celui de <= n'étant pas total).

  • Extra : PHP < l'opérateur peut être circulaire c'est-à-dire qu'il est possible que $a < $b , $b < $c y $c < $a :

    var_dump(INF < []);           // bool(true)
    var_dump([] < new stdClass);  // bool(true)
    var_dump(new stdClass < INF); // bool(true)

    Remarque : L'exemple ci-dessus génère un message d'erreur "Object of class stdClass could not be converted to double".

Vous trouverez quelques graphiques intéressants sur les opérateurs de comparaison de PHP sur le site PHP Sadness 52 - Opérateurs de comparaison .

En dernier lieu, je tiens à souligner qu'il y a deux égalités que PHP fait garantie (contrairement à presque tout le reste). Ces deux garanties tiennent toujours, simplement parce que le compilateur réduit l'une à l'autre :

($a > $b) == ($b < $a)
($a >= $b) == ($b <= $a)

90voto

CSᵠ Points 4712

Il y a pas de strictement identique les opérateurs de comparaison ( >== o <== ) en PHP (par PHP 5.6.14 au moins) mais il y a quelques moyens de appliquer un contrôle strict des types avant de vérifier le plus grand/le plus petit :

  1. Vérifiez les deux types de variables avec if (gettype($a) === gettype($b))
  2. Forcez votre type-cast nécessaire, par exemple. if ((string)$a === (string)$b)
  3. Forcez votre type de jonglerie nécessaire, par exemple. if (($a . '') === ($b . ''))

Prenez note que :

  • Précision de la virgule flottante est limitée
  • INF y NAN sont de type float sous ieee754
  • Quelques Infinity est égal à un autre Infinity (depuis PHP 5.4)
  • Notation scientifique e est toujours de type float et jamais integer même si le nombre est faible
  • Des nombres entiers qui dépassent PHP_INT_MAX sont automatiquement convertis en float
  • Les flotteurs qui se trouvent au-dessus des frontières du système obtiennent le INF valeur
  • Les variables indéfinies sont de type et de valeur NULL
  • Les nombres entiers précédés de 0 sont convertis d'octal en décimal (par convention)
  • Conversion des chaînes de caractères contenant un nombre entier avec un caractère de tête 0 à Le nombre entier enlève le premier 0

Liste de quelques comparaisons exotiques :

Very strange:
     $a      VS.     $b         $a>$b   $a<$b   $a<=$b  $a>=$b  $a==$b  $a===$b
  float(NAN)    float(-INF)     false   false   false   false   false   false
  float(NAN)      float(0)      false   false   false   false   false   false
  float(NAN)      float(1)      false   false   false   false   false   false
  float(NAN)     float(INF)     false   false   false   false   false   false
  float(NAN)     float(NAN)     false   false   false   false   false   false
  float(NAN)      int(-1)       false   false   false   false   false   false
  float(NAN)       int(0)       false   false   false   false   false   false
  float(NAN)       int(1)       false   false   false   false   false   false

Égales mais pas identiques :

     $a      VS.     $b         $a>$b   $a<$b   $a<=$b  $a>=$b  $a==$b  $a===$b
      NULL(NULL)      array()       false   false    true    true    true   false
  NULL(NULL)    bool(false)     false   false    true    true    true   false
  NULL(NULL)      float(0)      false   false    true    true    true   false
  NULL(NULL)       int(0)       false   false    true    true    true   false
  NULL(NULL)      str('')       false   false    true    true    true   false
   array()      bool(false)     false   false    true    true    true   false
 bool(false)      float(0)      false   false    true    true    true   false
 bool(false)       int(0)       false   false    true    true    true   false
   str('')      bool(false)     false   false    true    true    true   false
 bool(false)      str('0')      false   false    true    true    true   false
 float(-INF)     bool(true)     false   false    true    true    true   false
  bool(true)      float(1)      false   false    true    true    true   false
  float(INF)     bool(true)     false   false    true    true    true   false
  float(NAN)     bool(true)     false   false    true    true    true   false
  bool(true)      int(-1)       false   false    true    true    true   false
  bool(true)       int(1)       false   false    true    true    true   false
  bool(true)     str("\\0")      false   false    true    true    true   false
  bool(true)      str('+')      false   false    true    true    true   false
  bool(true)      str('-')      false   false    true    true    true   false
  bool(true)     str('01')      false   false    true    true    true   false
  bool(true)      str('1')      false   false    true    true    true   false
  bool(true)    str('false')    false   false    true    true    true   false
 str('text')     bool(true)     false   false    true    true    true   false
 str('true')     bool(true)     false   false    true    true    true   false
 **int(0)        float(0)      false   false    true    true    true   false
  str("\\0")       float(0)      false   false    true    true    true   false
   str('')        float(0)      false   false    true    true    true   false
   str('+')       float(0)      false   false    true    true    true   false
   str('-')       float(0)      false   false    true    true    true   false
   str('0')       float(0)      false   false    true    true    true   false
 str('false')     float(0)      false   false    true    true    true   false
 str('text')      float(0)      false   false    true    true    true   false
 str('true')      float(0)      false   false    true    true    true   false
    int(1)        float(1)      false   false    true    true    true   false
   float(1)      str('01')      false   false    true    true    true   false
   float(1)       str('1')      false   false    true    true    true   false
  str("\\0")        int(0)       false   false    true    true    true   false
   str('')         int(0)       false   false    true    true    true   false
   str('+')        int(0)       false   false    true    true    true   false
   str('-')        int(0)       false   false    true    true    true   false
    int(0)        str('0')      false   false    true    true    true   false
 str('false')      int(0)       false   false    true    true    true   false
 str('text')       int(0)       false   false    true    true    true   false
 str('true')       int(0)       false   false    true    true    true   false
    int(1)       str('01')      false   false    true    true    true   false
    int(1)        str('1')      false   false    true    true    true   false
   str('1')      str('01')      false   false    true    true    true   false**

Plus bas et plus grand en même temps ?

     $a      VS.     $b         $a>$b   $a<$b   $a<=$b  $a>=$b  $a==$b  $a===$b
  float(NAN)     str("\\0")       true    true    true    true   false   false
  float(NAN)      str('')        true    true    true    true   false   false
  float(NAN)      str('+')       true    true    true    true   false   false
  float(NAN)      str('-')       true    true    true    true   false   false
  float(NAN)      str('0')       true    true    true    true   false   false
  float(NAN)     str('01')       true    true    true    true   false   false
  float(NAN)      str('1')       true    true    true    true   false   false
  float(NAN)    str('false')     true    true    true    true   false   false
  float(NAN)    str('text')      true    true    true    true   false   false
  float(NAN)    str('true')      true    true    true    true   false   false

Égale ET identique :

     $a      VS.     $b         $a>$b   $a<$b   $a<=$b  $a>=$b  $a==$b  $a===$b
  NULL(NULL)     NULL(NULL)     false   false    true    true    true    true
 float(-INF)    float(-INF)     false   false    true    true    true    true
  float(INF)     float(INF)     false   false    true    true    true    true

inférieur ou supérieur :

     $a      VS.     $b         $a>$b   $a<$b   $a<=$b  $a>=$b  $a==$b  $a===$b
      NULL(NULL)     bool(true)     false    true    true   false   false   false
 float(-INF)     NULL(NULL)      true   false   false    true   false   false
  NULL(NULL)      float(1)      false    true    true   false   false   false
  float(INF)     NULL(NULL)      true   false   false    true   false   false
  float(NAN)     NULL(NULL)      true   false   false    true   false   false
  NULL(NULL)      int(-1)       false    true    true   false   false   false
  NULL(NULL)       int(1)       false    true    true   false   false   false
  NULL(NULL)     str("\\0")      false    true    true   false   false   false
  NULL(NULL)      str('+')      false    true    true   false   false   false
  NULL(NULL)      str('-')      false    true    true   false   false   false
  NULL(NULL)      str('0')      false    true    true   false   false   false
  NULL(NULL)     str('01')      false    true    true   false   false   false
  NULL(NULL)      str('1')      false    true    true   false   false   false
  NULL(NULL)    str('false')    false    true    true   false   false   false
  NULL(NULL)    str('text')     false    true    true   false   false   false
  NULL(NULL)    str('true')     false    true    true   false   false   false
 **array()       bool(true)     false    true    true   false   false   false
 float(-INF)      array()       false    true    true   false   false   false
   array()        float(0)       true   false   false    true   false   false
   array()        float(1)       true   false   false    true   false   false
  float(INF)      array()       false    true    true   false   false   false
  float(NAN)      array()       false    true    true   false   false   false
   array()        int(-1)        true   false   false    true   false   false
   array()         int(0)        true   false   false    true   false   false
   array()         int(1)        true   false   false    true   false   false
   array()       str("\\0")       true   false   false    true   false   false
   str('')        array()       false    true    true   false   false   false
   array()        str('+')       true   false   false    true   false   false
   array()        str('-')       true   false   false    true   false   false
   array()        str('0')       true   false   false    true   false   false
   array()       str('01')       true   false   false    true   false   false
   array()        str('1')       true   false   false    true   false   false
   array()      str('false')     true   false   false    true   false   false
   array()      str('text')      true   false   false    true   false   false
   array()      str('true')      true   false   false    true   false   false**  bool(true)    bool(false)      true   false   false    true   false   false
 float(-INF)    bool(false)      true   false   false    true   false   false
   float(1)     bool(false)      true   false   false    true   false   false
  float(INF)    bool(false)      true   false   false    true   false   false
  float(NAN)    bool(false)      true   false   false    true   false   false
 bool(false)      int(-1)       false    true    true   false   false   false
    int(1)      bool(false)      true   false   false    true   false   false
 bool(false)     str("\\0")      false    true    true   false   false   false
 bool(false)      str('+')      false    true    true   false   false   false
 bool(false)      str('-')      false    true    true   false   false   false
 bool(false)     str('01')      false    true    true   false   false   false
   str('1')     bool(false)      true   false   false    true   false   false
 bool(false)    str('false')    false    true    true   false   false   false
 str('text')    bool(false)      true   false   false    true   false   false
 str('true')    bool(false)      true   false   false    true   false   false
  bool(true)      float(0)       true   false   false    true   false   false
  bool(true)       int(0)        true   false   false    true   false   false
   str('')       bool(true)     false    true    true   false   false   false
  bool(true)      str('0')       true   false   false    true   false   false
 float(-INF)      float(0)      false    true    true   false   false   false
 float(-INF)      float(1)      false    true    true   false   false   false
  float(INF)    float(-INF)      true   false   false    true   false   false
 float(-INF)      int(-1)       false    true    true   false   false   false
 float(-INF)       int(0)       false    true    true   false   false   false
 float(-INF)       int(1)       false    true    true   false   false   false
 float(-INF)     str("\\0")      false    true    true   false   false   false
 float(-INF)      str('')       false    true    true   false   false   false
 float(-INF)      str('+')      false    true    true   false   false   false
 float(-INF)      str('-')      false    true    true   false   false   false
 float(-INF)      str('0')      false    true    true   false   false   false
 float(-INF)     str('01')      false    true    true   false   false   false
 float(-INF)      str('1')      false    true    true   false   false   false
 float(-INF)    str('false')    false    true    true   false   false   false
 float(-INF)    str('text')     false    true    true   false   false   false
 float(-INF)    str('true')     false    true    true   false   false   false
   float(1)       float(0)       true   false   false    true   false   false
  float(INF)      float(0)       true   false   false    true   false   false
   float(0)       int(-1)        true   false   false    true   false   false
    int(1)        float(0)       true   false   false    true   false   false
   float(0)      str('01')      false    true    true   false   false   false
   str('1')       float(0)       true   false   false    true   false   false
  float(INF)      float(1)       true   false   false    true   false   false
   float(1)       int(-1)        true   false   false    true   false   false
   float(1)        int(0)        true   false   false    true   false   false
   float(1)      str("\\0")       true   false   false    true   false   false
   str('')        float(1)      false    true    true   false   false   false
   float(1)       str('+')       true   false   false    true   false   false
   float(1)       str('-')       true   false   false    true   false   false
   float(1)       str('0')       true   false   false    true   false   false
   float(1)     str('false')     true   false   false    true   false   false
 str('text')      float(1)      false    true    true   false   false   false
 str('true')      float(1)      false    true    true   false   false   false
  float(INF)      int(-1)        true   false   false    true   false   false
  float(INF)       int(0)        true   false   false    true   false   false
  float(INF)       int(1)        true   false   false    true   false   false
  float(INF)     str("\\0")       true   false   false    true   false   false
  float(INF)      str('')        true   false   false    true   false   false
  float(INF)      str('+')       true   false   false    true   false   false
  float(INF)      str('-')       true   false   false    true   false   false
  float(INF)      str('0')       true   false   false    true   false   false
  float(INF)     str('01')       true   false   false    true   false   false
  float(INF)      str('1')       true   false   false    true   false   false
  float(INF)    str('false')     true   false   false    true   false   false
  float(INF)    str('text')      true   false   false    true   false   false
  float(INF)    str('true')      true   false   false    true   false   false
    int(0)        int(-1)        true   false   false    true   false   false
    int(1)        int(-1)        true   false   false    true   false   false
  str("\\0")       int(-1)        true   false   false    true   false   false
   str('')        int(-1)        true   false   false    true   false   false
   str('+')       int(-1)        true   false   false    true   false   false
   str('-')       int(-1)        true   false   false    true   false   false
   str('0')       int(-1)        true   false   false    true   false   false
   int(-1)       str('01')      false    true    true   false   false   false
   str('1')       int(-1)        true   false   false    true   false   false
 str('false')     int(-1)        true   false   false    true   false   false
 str('text')      int(-1)        true   false   false    true   false   false
 str('true')      int(-1)        true   false   false    true   false   false
    int(1)         int(0)        true   false   false    true   false   false
    int(0)       str('01')      false    true    true   false   false   false
   str('1')        int(0)        true   false   false    true   false   false
    int(1)       str("\\0")       true   false   false    true   false   false
   str('')         int(1)       false    true    true   false   false   false
    int(1)        str('+')       true   false   false    true   false   false
    int(1)        str('-')       true   false   false    true   false   false
    int(1)        str('0')       true   false   false    true   false   false
    int(1)      str('false')     true   false   false    true   false   false
 **str('text')       int(1)       false    true    true   false   false   false**
 str('true')       int(1)       false    true    true   false   false   false
   str('')       str("\\0")      false    true    true   false   false   false
   str('+')      str("\\0")       true   false   false    true   false   false
   str('-')      str("\\0")       true   false   false    true   false   false
  str("\\0")       str('0')      false    true    true   false   false   false
  str("\\0")      str('01')      false    true    true   false   false   false
   str('1')      str("\\0")       true   false   false    true   false   false
 str('false')    str("\\0")       true   false   false    true   false   false
 str('text')     str("\\0")       true   false   false    true   false   false
 str('true')     str("\\0")       true   false   false    true   false   false
   str('')        str('+')      false    true    true   false   false   false
   str('')        str('-')      false    true    true   false   false   false
   str('')        str('0')      false    true    true   false   false   false
   str('')       str('01')      false    true    true   false   false   false
   str('')        str('1')      false    true    true   false   false   false
   str('')      str('false')    false    true    true   false   false   false
   str('')      str('text')     false    true    true   false   false   false
   str('')      str('true')     false    true    true   false   false   false
 **str('-')       str('+')       true   false   false    true   false   false**
   str('+')       str('0')      false    true    true   false   false   false
   str('+')      str('01')      false    true    true   false   false   false
   str('1')       str('+')       true   false   false    true   false   false
 str('false')     str('+')       true   false   false    true   false   false
 str('text')      str('+')       true   false   false    true   false   false
 str('true')      str('+')       true   false   false    true   false   false
   str('-')       str('0')      false    true    true   false   false   false
   str('-')      str('01')      false    true    true   false   false   false
   str('1')       str('-')       true   false   false    true   false   false
 str('false')     str('-')       true   false   false    true   false   false
 str('text')      str('-')       true   false   false    true   false   false
 str('true')      str('-')       true   false   false    true   false   false
   str('0')      str('01')      false    true    true   false   false   false
   str('1')       str('0')       true   false   false    true   false   false
 str('false')     str('0')       true   false   false    true   false   false
 str('text')      str('0')       true   false   false    true   false   false
 str('true')      str('0')       true   false   false    true   false   false
 str('false')    str('01')       true   false   false    true   false   false
 str('text')     str('01')       true   false   false    true   false   false
 str('true')     str('01')       true   false   false    true   false   false
   str('1')     str('false')    false    true    true   false   false   false
 str('text')      str('1')       true   false   false    true   false   false
 str('true')      str('1')       true   false   false    true   false   false
 **str('text')    str('false')     true   false   false    true   false   false
 str('true')    str('false')     true   false   false    true   false   false** str('true')    str('text')      true   false   false    true   false   false

$a > $b > $c Une énigme quand : $a n'est pas supérieur à $c .

A<C   : float(NAN)  >  str('a')   >   str('')
A<C   : float(NAN)  >  str('a')   >   str('1')
A<C   : float(NAN)  >  str('a')   >   str('A')
A<C   : float(NAN)  >  str('a')   >   str('0')
A<C   : float(NAN)  >  str('1')   >   str('')
A<C   : float(NAN)  >  str('1')   >   str('0')
A<C   : float(NAN)  >  str('A')   >   str('')
A<C   : float(NAN)  >  str('A')   >   str('1')
A<C   : float(NAN)  >  str('A')   >   str('0')
A<C   : float(NAN)  >  str('0')   >   str('')
A<C   :   str('')   > float(NAN)  >   str('a')
A<C   :   str('')   > float(NAN)  >   str('1')
A<C   :   str('')   > float(NAN)  >   str('A')
A<C   :   str('')   > float(NAN)  >   str('0')
A<C   :  str('a')   >   str('')   >  float(NAN)
A<C   :  str('a')   >  str('1')   >  float(NAN)
A<C   :  str('a')   >  str('A')   >  float(NAN)
A<C   :  str('a')   >  str('0')   >  float(NAN)
A<C   :  str('0')   >   str('')   >  float(NAN)
A==C  : bool(true)  >   str('')   >  float(NAN)
A==C  : bool(true)  >   str('')   > float(-INF)
A==C  : bool(true)  >   str('')   >   int(-1)
A==C  : bool(true)  >   str('')   >  float(-1)
A==C  : bool(true)  >   array()   >  float(NAN)
A==C  : bool(true)  >   array()   >  float(INF)
A==C  : bool(true)  >   array()   > float(-INF)
A==C  : bool(true)  >   array()   >   str('a')
A==C  : bool(true)  >   array()   >    int(1)
A==C  : bool(true)  >   array()   >   float(1)
A==C  : bool(true)  >   array()   >   str('1')
A==C  : bool(true)  >   array()   >   str('A')
A==C  : bool(true)  >   array()   >   int(-1)
A==C  : bool(true)  >   array()   >  float(-1)
A==C  : bool(true)  >   int(0)    > float(-INF)
A==C  : bool(true)  >   int(0)    >   int(-1)
A==C  : bool(true)  >   int(0)    >  float(-1)
A==C  : bool(true)  >  str('0')   >  float(NAN)
A==C  : bool(true)  >  str('0')   > float(-INF)
A==C  : bool(true)  >  str('0')   >   int(-1)
A==C  : bool(true)  >  str('0')   >  float(-1)
A==C  : bool(true)  >  float(0)   > float(-INF)
A==C  : bool(true)  >  float(0)   >   int(-1)
A==C  : bool(true)  >  float(0)   >  float(-1)
A==C  :   int(1)    >  str('a')   >   str('1')
A==C  :   int(1)    >  str('A')   >   str('1')
A==C  :  float(1)   >  str('a')   >   str('1')
A==C  :  float(1)   >  str('A')   >   str('1')
A==C  :  str('a')   >  str('1')   >    int(0)
A==C  :  str('a')   >  str('1')   >   float(0)
A==C  :   str('')   > float(-INF) >  NULL(NULL)
A==C  :   str('')   > float(-INF) > bool(false)
A==C  :   str('')   >   int(-1)   >  NULL(NULL)
A==C  :   str('')   >   int(-1)   > bool(false)
A==C  :   str('')   >  float(-1)  >  NULL(NULL)
A==C  :   str('')   >  float(-1)  > bool(false)
A==C  :   array()   > float(NAN)  >  NULL(NULL)
A==C  :   array()   > float(NAN)  > bool(false)
A==C  :   array()   > float(INF)  >  NULL(NULL)
A==C  :   array()   > float(INF)  > bool(false)
A==C  :   array()   > float(-INF) >  NULL(NULL)
A==C  :   array()   > float(-INF) > bool(false)
A==C  :   array()   >  str('a')   >  NULL(NULL)
A==C  :   array()   >  str('a')   > bool(false)
A==C  :   array()   >   int(1)    >  NULL(NULL)
A==C  :   array()   >   int(1)    > bool(false)
A==C  :   array()   >  float(1)   >  NULL(NULL)
A==C  :   array()   >  float(1)   > bool(false)
A==C  :   array()   >  str('1')   >  NULL(NULL)
A==C  :   array()   >  str('1')   > bool(false)
A==C  :   array()   >  str('A')   >  NULL(NULL)
A==C  :   array()   >  str('A')   > bool(false)
A==C  :   array()   >  str('0')   >  NULL(NULL)
A==C  :   array()   >   int(-1)   >  NULL(NULL)
A==C  :   array()   >   int(-1)   > bool(false)
A==C  :   array()   >  float(-1)  >  NULL(NULL)
A==C  :   array()   >  float(-1)  > bool(false)
A==C  :   str('')   > float(NAN)  > bool(false)
A==C  :   str('')   > float(NAN)  >  NULL(NULL)
A==C  :  str('A')   >  str('1')   >    int(0)
A==C  :  str('A')   >  str('1')   >   float(0)
A==C  :   int(0)    > float(-INF) >  NULL(NULL)
A==C  :   int(0)    > float(-INF) > bool(false)
A==C  :   int(0)    >   int(-1)   >  NULL(NULL)
A==C  :   int(0)    >   int(-1)   > bool(false)
A==C  :   int(0)    >  float(-1)  >  NULL(NULL)
A==C  :   int(0)    >  float(-1)  > bool(false)
A==C  :  str('0')   > float(NAN)  > bool(false)
A==C  :  str('0')   > float(-INF) > bool(false)
A==C  :  str('0')   >   int(-1)   > bool(false)
A==C  :  str('0')   >  float(-1)  > bool(false)
A==C  :  float(0)   > float(-INF) >  NULL(NULL)
A==C  :  float(0)   > float(-INF) > bool(false)
A==C  :  float(0)   >   int(-1)   >  NULL(NULL)
A==C  :  float(0)   >   int(-1)   > bool(false)
A==C  :  float(0)   >  float(-1)  >  NULL(NULL)
A==C  :  float(0)   >  float(-1)  > bool(false)
A===C :  str('0')   > float(NAN)  >   str('0')
A===C :   str('')   > float(NAN)  >   str('')
A===C :  str('a')   > float(NAN)  >   str('a')
A===C :  str('1')   > float(NAN)  >   str('1')
A===C :  str('A')   > float(NAN)  >   str('A')

Comparaison amusante de chaînes de caractères : "Queen". <code>></code> "King <code>></code> "Jack <code>></code> Ace

Consultez également Tableaux de comparaison des types de PHP paires de couvertures :

  • isset() y is_null()
  • if() y empty()
  • boolean == vs. ===

Vérifiez les différences entre les versions de PHP en direct sur le site. http://3v4l.org/MAfDu .

22voto

Walter Tross Points 3559

Après avoir corrigé la deuxième partie de votre question, je laisse la réponse à cette partie aux autres. Je veux juste donner la réponse la plus surprenante à la première partie de votre question, c'est-à-dire s'il existe un exemple de la < y > les opérateurs étant intransitifs. C'est ici.

Ce sont tous true :

"10" < "1a"
"1a" < "2"
"10" > "2"

Si < étaient transitifs ( $a < $b$b < $c$a < $c ), la dernière ligne serait

"10" < "2"

mais PHP essaie d'être gentil ( ?!) et d'interpréter les chaînes de caractères comme des nombres quand il le peut.

Il s'avère que, en raison de l'intransitivité ci-dessus, sort() peut trier les même dans un différents en fonction de leur ordre d'entrée, même lorsque deux éléments ne sont pas == (et aucun élément n'est NAN). Je l'ai signalé dans un commentaire à sort() dont l'essence est :

sort(array("10", "1a", "2" )) => array("10", "1a", "2" )
sort(array("10", "2",  "1a")) => array("1a", "2",  "10")
sort(array("1a", "10", "2" )) => array("2",  "10", "1a")
sort(array("1a", "2",  "10")) => array("1a", "2",  "10")
sort(array("2",  "10", "1a")) => array("2",  "10", "1a")
sort(array("2",  "1a", "10")) => array("10", "1a", "2" )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X