PHP'de tür-hokkabazlık ve (katı) büyük / küçük karşılaştırmalar


115

PHP, tür hokkabazlığı ile ünlüdür. Bunun beni şaşırttığını kabul etmeliyim ve karşılaştırmalarda temel mantıksal / temel şeyleri bulmakta zorlanıyorum.

Örneğin: Eğer $a > $bdoğruysa ve $b > $cdoğruysa, bunun $a > $cda her zaman doğru olduğu anlamına mı gelmelidir ?

Temel mantığı takip ederek, evet derdim ancak o kadar şaşırdım ki PHP'ye bu konuda gerçekten güvenmiyorum. Belki birisi bunun böyle olmadığı bir örnek verebilir?

Ayrıca, sol ve sağ işlenenlerin değiştirilip değiştirilmesinin herhangi bir fark yaratıp yaratmayacağını merak ediyorum (bunların anlamları, yalnızca geçmişte eşitlik karşılaştırmalarından bildiğim gibi kesin olarak tanımlandığı için) daha küçük ve kesin büyük operatörlerle kesinlikle eşit olmayan değerler:

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

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

Tüm tür karşılaştırma kombinasyonlarının çoğu için, bu büyük / küçük karşılaştırma operatörleri belgelenmemiştir, bu nedenle bu durumda kılavuzu okumak gerçekten yardımcı olmamıştır.


Sanırım bu satırı düzeltmek istiyorsun ($a > $b) !== ($b < $a)?
Walter Tross

ah, tamam, bu yüzden yanlış anladım. Cevabımı buna göre düzeltmem gerekecek. Komik tüm bu insanlar cevapların yerine risaleler yazmaya ve dikkatlice sorunuzu ... okumayan
Walter Tross

Yanıtlar:


208

PHP'nin karşılaştırma operatörleri bilgisayardaki bilimsel tanımlardan birkaç yönden sapmaktadır:

Bir eşdeğerlik ilişkisi == oluşturmak için dönüşlü, simetrik ve geçişli olması gerekir:

  • PHP'nin ==işleci dönüşlü değildir , yani $a == $aher zaman doğru değildir:

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

    Not: İçerdiği herhangi bir karşılaştırmanın NANher zaman falsePHP'ye özgü olmadığı gerçeği . Kayan Nokta Aritmetiği için IEEE 754 Standardı tarafından zorunlu kılınmıştır ( daha fazla bilgi ).

  • PHP'nin ==operatörü simetriktir , yani $a == $bve $b == $aher zaman aynıdır.

  • PHP'nin ==operatörüdür geçişli değildir yani gelen $a == $bve $b == $cyok değil şu $a == $c:

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

Kısmi bir düzen oluşturmak için<= / >=dönüşlü, simetrik olmayan ve geçişli olması gerekir:

  • PHP'nin <=operatörü dönüşlü değildir , yani $a <= $aher zaman doğru değildir (Örnek for ile aynıdır ==).

  • PHP <=operatörü anti-simetrik değildir , yani aşağıdakilerden $a <= $bve $b <= $atakip etmez $a == $b:

    var_dump(NAN <= "foo"); // bool(true)
    var_dump("foo" <= NAN); // bool(true)
    var_dump(NAN == "foo"); // bool(false)
  • PHP'nin <=operatörü geçişli değildir , yani from $a <= $bve $b <= $ctakip etmez $a <= $c(Örnek for ile aynı ==).

  • Ekstra: PHP'nin <=operatörü toplam değil , yani ikisi birden $a <= $bve $b <= $ayanlış olabilir:

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

Kesin bir kısmi düzen oluşturmak için< / >dönüşsüz, asimetrik ve geçişli olması gerekir:

  • PHP'nin <operatörü yansımasızdır , yani $a < $aasla doğru değildir. Bunun yalnızca PHP 5.4'ten itibaren geçerli olduğuna dikkat edin . Daha önce olarak INF < INFdeğerlendirildi true.

  • PHP'nin <operatörü asimetrik değildir , yani dan $a < $bgelmez !($b < $a)(Örnek <=anti-simetrik olmama ile aynıdır ).

  • PHP'nin <operatörü geçişli değildir , yani aşağıdakilerden $a < $bve $b < $ctakip etmez $a < $c:

    var_dump(-INF < 0);    // bool(true)
    var_dump(0 < TRUE);    // bool(true)
    var_dump(-INF < TRUE); // bool(false)
  • Ekstra: PHP'nin <operatörüdür trichotomous değil yani hepsi, $a < $b, $b < $ave $a == $b(gelince Örneği aynı yanlış olabilir <=toplam olarak değil).

  • Ekstra: PHP'nin <operatörü olabilir dairesel , yani bu mümkün yani $a < $b, $b < $cve $c < $a:

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

    Not: Yukarıdaki örnek, "stdClass sınıfının nesnesi çift olarak dönüştürülemedi" uyarısı atar.

PHP Sadness 52 - Karşılaştırma operatörleri üzerinde PHP'nin karşılaştırma operatörleri için birkaç güzel grafik bulabilirsiniz .

Son bir not olarak, PHP iki eşitlikler olduğunu işaret etmek istiyorum yapar (başka hemen hemen her şeyi tersine) garanti. Bu ikisi her zaman tutulur, çünkü derleyici birini diğerine indirgediği için:

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

2
Vay canına, güzel cevap. O gibi PHP ile mantıksal ifadeleri formüle etmek mümkün değildir Yani ($a > $b) and ($b > $c)ile $a > $cdokümantasyon olanlar söylese de </ >operatörler olduklarını söylüyor sıkı ?
hakre

26
IMHO operatörleri matematik kurallarını takip eder, ancak yalnızca aynı veri türleriyle uğraşırken. Tip atama, burada (ve diğer birçok durumda) kafa karışıklığını gerçekten yaratan şeydir. Sayıları ve dizeleri karşılaştırırken ve özel değerler türü dönüşümleri operatörlerden önce yapılır, bu nedenle kesinlikle karşılaştırma operatörleri kafa karıştırıcı değildir, döküm ...
ivanhoe

6
@ ivanhoe011 Gerçek şu ki: Her ikisi de :) PHP'nin karşılaştırma kuralları ve PHP'nin çevrim kuralları farklıdır , $a == $bbunun aynı olduğunu söyleyemezsiniz (type) $a === (type) $b. Bunun basit bir örneği şudur "15" == "0xf", ama (int) "15" !== (int) "0xf". Ve PHP'de hem karşılaştırma hem de çevrim kuralları tamamen çılgınca ^^
NikiC

3
@NikiC: (int)"0xf"tamsayı olarak değerlendirilir 0, tabii ki 0 !== 15. Bu örnekteki karşılaştırma tam olarak beklendiği gibi davranır. Burada kafa karıştıran oyuncu seçimi. Kabul ediyorum, (INF < INF) === truegerçek bir karşılaştırma problemiydi, ama bu özel bir durumdu ve sizin de belirttiğiniz gibi çözüldü. Harika cevap .. +1
FtDRbwLXw6

1
O zamanlar tür zorlaması hakkında mantıklı olan bazı kararlar için PHP tasarımcılarını mutlaka suçlamıyorum ... ama bu tasarım seçimlerinin sonuçlarını fark etmesi ve seçimlerin açıkça yanlış olduğunu hemen fark etmesi gerektiğini düşünüyorum. En bariz örnek @ ravz'ın yorumu.
Çad

88

Orada hiçbir sıkı özdeş karşılaştırma operatörleri ( >==veya <==PHP) (en azından PHP 5.6.14 tarafından) , fakat birkaç yolu vardır sıkı tip onay zorlamak Büyükşehir / Aşağı kontrol etmeden önce:

  1. Her iki değişken türünü de kontrol edin if (gettype($a) === gettype($b))
  2. İhtiyaç duyduğunuz tür dökümünü zorlayın, örneğin. if ((string)$a === (string)$b)
  3. İhtiyaç duyduğunuz tip hokkabazlığınızı zorlayın, örneğin. if (($a . '') === ($b . ''))

Şunlara dikkat edin:

  • Kayan nokta hassasiyeti sınırlıdır
  • INFve NANtürünün floataltında
  • Bazı Sonsuz diğer bazı eşittir Infinity (beri PHP 5.4)
  • Bilimsel gösterim eher zaman tiptedir floatve integersayı küçük olsa bile asla
  • Tamsayılar PHP_INT_MAXotomatik olarakfloat
  • Sistemin sınırları üzerinde süzülerek INFdeğeri alır
  • Tanımlanmamış değişkenlerin türü ve değeri vardır NULL
  • Önündeki tamsayılar 0sekizlik tabandan ondalık sayıya dönüştürülür (kural olarak)
  • Önde gelen bir tamsayısını içeren dizeleri 0 için tamsayı gelen şeritler0

Bazı egzotik karşılaştırmaların listesi:

Çok ilginç:
     $ a VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  float (NAN) float (-INF) yanlış yanlış yanlış yanlış yanlış yanlış yanlış
  float (NAN) float (0) yanlış yanlış yanlış yanlış yanlış yanlış
  float (NAN) float (1) yanlış yanlış yanlış yanlış yanlış yanlış
  float (NAN) float (INF) yanlış yanlış yanlış yanlış yanlış yanlış
  float (NAN) float (NAN) false false false false false false
  float (NAN) int (-1) yanlış yanlış yanlış yanlış yanlış yanlış
  float (NAN) int (0) yanlış yanlış yanlış yanlış yanlış yanlış
  float (NAN) int (1) yanlış yanlış yanlış yanlış yanlış yanlış

Eşit ama aynı değil:

     $ a VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  NULL (NULL) array () false false true true true false
  BOOL (NULL) bool (yanlış) yanlış yanlış doğru doğru doğru yanlış
  NULL (NULL) float (0) yanlış yanlış doğru doğru doğru yanlış
  NULL (NULL) int (0) yanlış yanlış doğru doğru doğru yanlış
  NULL (NULL) str ('') yanlış yanlış doğru doğru doğru yanlış
   dizi () bool (yanlış) yanlış yanlış doğru doğru doğru yanlış
 bool (yanlış) float (0) yanlış yanlış doğru doğru doğru yanlış
 bool (yanlış) int (0) yanlış yanlış doğru doğru doğru yanlış
   str ('') bool (yanlış) yanlış yanlış doğru doğru doğru yanlış
 bool (yanlış) str ('0') yanlış yanlış doğru doğru doğru yanlış
 float (-INF) bool (doğru) yanlış yanlış doğru doğru doğru yanlış
  bool (doğru) float (1) yanlış yanlış doğru doğru doğru yanlış
  float (INF) bool (doğru) yanlış yanlış doğru doğru doğru yanlış
  float (NAN) bool (doğru) yanlış yanlış doğru doğru doğru yanlış
  bool (doğru) int (-1) yanlış yanlış doğru doğru doğru yanlış
  bool (doğru) int (1) yanlış yanlış doğru doğru doğru yanlış
  bool (doğru) str ("\ 0") yanlış yanlış doğru doğru doğru yanlış
  bool (doğru) str ('+') yanlış yanlış doğru doğru doğru yanlış
  bool (doğru) str ('-') yanlış yanlış doğru doğru doğru yanlış
  bool (doğru) str ('01 ') yanlış yanlış doğru doğru doğru yanlış
  bool (doğru) str ('1') yanlış yanlış doğru doğru doğru yanlış
  bool (doğru) str ('yanlış') yanlış yanlış doğru doğru doğru yanlış
 str ('metin') bool (doğru) yanlış yanlış doğru doğru doğru yanlış
 str ('doğru') bool (doğru) yanlış yanlış doğru doğru doğru yanlış
    int (0) float (0) yanlış yanlış doğru doğru doğru yanlış
  str ("\ 0") float (0) yanlış yanlış doğru doğru doğru yanlış
   str ('') float (0) yanlış yanlış doğru doğru doğru yanlış
   str ('+') float (0) yanlış yanlış doğru doğru doğru yanlış
   str ('-') float (0) yanlış yanlış doğru doğru doğru yanlış
   str ('0') float (0) yanlış yanlış doğru doğru doğru yanlış
 str ('yanlış') float (0) yanlış yanlış doğru doğru doğru yanlış
 str ('metin') float (0) yanlış yanlış doğru doğru doğru yanlış
 str ('doğru') float (0) yanlış yanlış doğru doğru doğru yanlış
    int (1) float (1) yanlış yanlış doğru doğru doğru yanlış
   float (1) str ('01 ') yanlış yanlış doğru doğru doğru yanlış
   float (1) str ('1') yanlış yanlış doğru doğru doğru yanlış
  str ("\ 0") int (0) yanlış yanlış doğru doğru doğru yanlış
   str ('') int (0) yanlış yanlış doğru doğru doğru yanlış
   str ('+') int (0) yanlış yanlış doğru doğru doğru yanlış
   str ('-') int (0) yanlış yanlış doğru doğru doğru yanlış
    int (0) str ('0') yanlış yanlış doğru doğru doğru yanlış
 str ('yanlış') int (0) yanlış yanlış doğru doğru doğru yanlış
 str ('metin') int (0) yanlış yanlış doğru doğru doğru yanlış
 str ('doğru') int (0) yanlış yanlış doğru doğru doğru yanlış
    int (1) str ('01 ') yanlış yanlış doğru doğru doğru yanlış
    int (1) str ('1') yanlış yanlış doğru doğru doğru yanlış
   str ('1') str ('01 ') yanlış yanlış doğru doğru doğru yanlış

Aynı anda daha düşük ve daha büyük mü?

     $ a VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  float (NAN) str ("\ 0") doğru doğru doğru doğru yanlış yanlış
  float (NAN) str ('') doğru doğru doğru doğru yanlış yanlış
  float (NAN) str ('+') doğru doğru doğru doğru yanlış yanlış
  float (NAN) str ('-') doğru doğru doğru doğru yanlış yanlış
  float (NAN) str ('0') doğru doğru doğru doğru yanlış yanlış
  float (NAN) str ('01 ') doğru doğru doğru doğru yanlış yanlış
  float (NAN) str ('1') doğru doğru doğru doğru yanlış yanlış
  float (NAN) str ('yanlış') doğru doğru doğru doğru yanlış yanlış
  float (NAN) str ('metin') doğru doğru doğru doğru yanlış yanlış
  float (NAN) str ('doğru') doğru doğru doğru doğru yanlış yanlış

Eşit VE aynı:

     $ a VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  NULL (NULL) NULL (NULL) yanlış yanlış doğru doğru doğru doğru
 float (-INF) float (-INF) yanlış yanlış doğru doğru doğru doğru
  float (INF) float (INF) yanlış yanlış doğru doğru doğru doğru

Daha Düşük veya Daha Büyük:

     $ a VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  NULL (NULL) bool (doğru) yanlış doğru doğru yanlış yanlış yanlış
 float (-INF) NULL (NULL) doğru yanlış yanlış doğru yanlış yanlış
  NULL (NULL) float (1) yanlış doğru doğru yanlış yanlış yanlış
  float (INF) NULL (NULL) doğru yanlış yanlış doğru yanlış yanlış
  float (NAN) NULL (NULL) doğru yanlış yanlış doğru yanlış yanlış
  NULL (NULL) int (-1) yanlış doğru doğru yanlış yanlış yanlış
  NULL (NULL) int (1) yanlış doğru doğru yanlış yanlış yanlış
  NULL (NULL) str ("\ 0") yanlış doğru doğru yanlış yanlış yanlış
  NULL (NULL) str ('+') yanlış doğru doğru yanlış yanlış yanlış
  NULL (NULL) str ('-') yanlış doğru doğru yanlış yanlış yanlış
  NULL (NULL) str ('0') yanlış doğru doğru yanlış yanlış yanlış
  NULL (NULL) str ('01 ') yanlış doğru doğru yanlış yanlış yanlış
  NULL (NULL) str ('1') yanlış doğru doğru yanlış yanlış yanlış
  NULL (NULL) str ('yanlış') yanlış doğru doğru yanlış yanlış yanlış
  NULL (NULL) str ('metin') yanlış doğru doğru yanlış yanlış yanlış
  NULL (NULL) str ('doğru') yanlış doğru doğru yanlış yanlış yanlış
   array () bool (doğru) yanlış doğru doğru yanlış yanlış yanlış
 float (-INF) dizi () yanlış doğru doğru yanlış yanlış yanlış
   dizi () float (0) doğru yanlış yanlış doğru yanlış yanlış
   array () float (1) doğru yanlış yanlış doğru yanlış yanlış
  float (INF) array () yanlış doğru doğru yanlış yanlış yanlış
  float (NAN) array () yanlış doğru doğru yanlış yanlış yanlış
   dizi () int (-1) doğru yanlış yanlış doğru yanlış yanlış
   dizi () int (0) doğru yanlış yanlış doğru yanlış yanlış
   array () int (1) doğru yanlış yanlış doğru yanlış yanlış
   dizi () str ("\ 0") doğru yanlış yanlış doğru yanlış yanlış
   str ('') array () yanlış doğru doğru yanlış yanlış yanlış
   dizi () str ('+') doğru yanlış yanlış doğru yanlış yanlış
   dizi () str ('-') doğru yanlış yanlış doğru yanlış yanlış
   dizi () str ('0') doğru yanlış yanlış doğru yanlış yanlış
   dizi () str ('01 ') doğru yanlış yanlış doğru yanlış yanlış
   dizi () str ('1') doğru yanlış yanlış doğru yanlış yanlış
   dizi () str ('yanlış') doğru yanlış yanlış doğru yanlış yanlış
   dizi () str ('metin') doğru yanlış yanlış doğru yanlış yanlış
   dizi () str ('doğru') doğru yanlış yanlış doğru yanlış yanlış
  bool (doğru) bool (yanlış) doğru yanlış yanlış doğru yanlış yanlış
 float (-INF) bool (yanlış) doğru yanlış yanlış doğru yanlış yanlış
   float (1) bool (yanlış) doğru yanlış yanlış doğru yanlış yanlış
  float (INF) bool (yanlış) doğru yanlış yanlış doğru yanlış yanlış
  float (NAN) bool (yanlış) doğru yanlış yanlış doğru yanlış yanlış
 bool (yanlış) int (-1) yanlış doğru doğru yanlış yanlış yanlış
    int (1) bool (yanlış) doğru yanlış yanlış doğru yanlış yanlış
 bool (yanlış) str ("\ 0") yanlış doğru doğru yanlış yanlış yanlış
 bool (yanlış) str ('+') yanlış doğru doğru yanlış yanlış yanlış
 bool (yanlış) str ('-') yanlış doğru doğru yanlış yanlış yanlış
 bool (yanlış) str ('01 ') yanlış doğru doğru yanlış yanlış yanlış
   str ('1') bool (yanlış) doğru yanlış yanlış doğru yanlış yanlış
 bool (yanlış) str ('yanlış') yanlış doğru doğru yanlış yanlış yanlış
 str ('metin') bool (yanlış) doğru yanlış yanlış doğru yanlış yanlış
 str ('doğru') bool (yanlış) doğru yanlış yanlış doğru yanlış yanlış
  bool (doğru) float (0) doğru yanlış yanlış doğru yanlış yanlış
  bool (doğru) int (0) doğru yanlış yanlış doğru yanlış yanlış
   str ('') bool (doğru) yanlış doğru doğru yanlış yanlış yanlış
  bool (doğru) str ('0') doğru yanlış yanlış doğru yanlış yanlış
 float (-INF) float (0) yanlış doğru doğru yanlış yanlış yanlış
 float (-INF) float (1) yanlış doğru doğru yanlış yanlış yanlış
  float (INF) float (-INF) doğru yanlış yanlış doğru yanlış yanlış
 float (-INF) int (-1) yanlış doğru doğru yanlış yanlış yanlış
 float (-INF) int (0) yanlış doğru doğru yanlış yanlış yanlış
 float (-INF) int (1) yanlış doğru doğru yanlış yanlış yanlış
 float (-INF) str ("\ 0") yanlış doğru doğru yanlış yanlış yanlış
 float (-INF) str ('') yanlış doğru doğru yanlış yanlış yanlış
 float (-INF) str ('+') yanlış doğru doğru yanlış yanlış yanlış
 float (-INF) str ('-') yanlış doğru doğru yanlış yanlış yanlış
 float (-INF) str ('0') yanlış doğru doğru yanlış yanlış yanlış
 float (-INF) str ('01 ') yanlış doğru doğru yanlış yanlış yanlış
 float (-INF) str ('1') yanlış doğru doğru yanlış yanlış yanlış
 float (-INF) str ('yanlış') yanlış doğru doğru yanlış yanlış yanlış
 float (-INF) str ('metin') yanlış doğru doğru yanlış yanlış yanlış
 float (-INF) str ('doğru') yanlış doğru doğru yanlış yanlış yanlış
   float (1) float (0) doğru yanlış yanlış doğru yanlış yanlış
  float (INF) float (0) doğru yanlış yanlış doğru yanlış yanlış
   float (0) int (-1) doğru yanlış yanlış doğru yanlış yanlış
    int (1) float (0) doğru yanlış yanlış doğru yanlış yanlış
   float (0) str ('01 ') yanlış doğru doğru yanlış yanlış yanlış
   str ('1') float (0) doğru yanlış yanlış doğru yanlış yanlış
  float (INF) float (1) doğru yanlış yanlış doğru yanlış yanlış
   float (1) int (-1) doğru yanlış yanlış doğru yanlış yanlış
   float (1) int (0) doğru yanlış yanlış doğru yanlış yanlış
   float (1) str ("\ 0") doğru yanlış yanlış doğru yanlış yanlış
   str ('') float (1) yanlış doğru doğru yanlış yanlış yanlış
   float (1) str ('+') doğru yanlış yanlış doğru yanlış yanlış
   float (1) str ('-') doğru yanlış yanlış doğru yanlış yanlış
   float (1) str ('0') doğru yanlış yanlış doğru yanlış yanlış
   float (1) str ('yanlış') doğru yanlış yanlış doğru yanlış yanlış
 str ('metin') float (1) yanlış doğru doğru yanlış yanlış yanlış
 str ('doğru') float (1) yanlış doğru doğru yanlış yanlış yanlış
  float (INF) int (-1) doğru yanlış yanlış doğru yanlış yanlış
  float (INF) int (0) doğru yanlış yanlış doğru yanlış yanlış
  float (INF) int (1) doğru yanlış yanlış doğru yanlış yanlış
  float (INF) str ("\ 0") doğru yanlış yanlış doğru yanlış yanlış
  float (INF) str ('') doğru yanlış yanlış doğru yanlış yanlış
  float (INF) str ('+') doğru yanlış yanlış doğru yanlış yanlış
  float (INF) str ('-') doğru yanlış yanlış doğru yanlış yanlış
  float (INF) str ('0') doğru yanlış yanlış doğru yanlış yanlış
  float (INF) str ('01 ') doğru yanlış yanlış doğru yanlış yanlış
  float (INF) str ('1') doğru yanlış yanlış doğru yanlış yanlış
  float (INF) str ('yanlış') doğru yanlış yanlış doğru yanlış yanlış
  float (INF) str ('metin') doğru yanlış yanlış doğru yanlış yanlış
  float (INF) str ('doğru') doğru yanlış yanlış doğru yanlış yanlış
    int (0) int (-1) doğru yanlış yanlış doğru yanlış yanlış
    int (1) int (-1) doğru yanlış yanlış doğru yanlış yanlış
  str ("\ 0") int (-1) doğru yanlış yanlış doğru yanlış yanlış
   str ('') int (-1) doğru yanlış yanlış doğru yanlış yanlış
   str ('+') int (-1) doğru yanlış yanlış doğru yanlış yanlış
   str ('-') int (-1) doğru yanlış yanlış doğru yanlış yanlış
   str ('0') int (-1) doğru yanlış yanlış doğru yanlış yanlış
   int (-1) str ('01 ') yanlış doğru doğru yanlış yanlış yanlış
   str ('1') int (-1) doğru yanlış yanlış doğru yanlış yanlış
 str ('yanlış') int (-1) doğru yanlış yanlış doğru yanlış yanlış
 str ('metin') int (-1) doğru yanlış yanlış doğru yanlış yanlış
 str ('doğru') int (-1) doğru yanlış yanlış doğru yanlış yanlış
    int (1) int (0) doğru yanlış yanlış doğru yanlış yanlış
    int (0) str ('01 ') yanlış doğru doğru yanlış yanlış yanlış
   str ('1') int (0) doğru yanlış yanlış doğru yanlış yanlış
    int (1) str ("\ 0") doğru yanlış yanlış doğru yanlış yanlış
   str ('') int (1) yanlış doğru doğru yanlış yanlış yanlış
    int (1) str ('+') doğru yanlış yanlış doğru yanlış yanlış
    int (1) str ('-') doğru yanlış yanlış doğru yanlış yanlış
    int (1) str ('0') doğru yanlış yanlış doğru yanlış yanlış
    int (1) str ('yanlış') doğru yanlış yanlış doğru yanlış yanlış
 str ('metin') int (1) yanlış doğru doğru yanlış yanlış yanlış
 str ('doğru') int (1) yanlış doğru doğru yanlış yanlış yanlış
   str ('') str ("\ 0") yanlış doğru doğru yanlış yanlış yanlış
   str ('+') str ("\ 0") doğru yanlış yanlış doğru yanlış yanlış
   str ('-') str ("\ 0") doğru yanlış yanlış doğru yanlış yanlış
  str ("\ 0") str ('0') yanlış doğru doğru yanlış yanlış yanlış
  str ("\ 0") str ('01 ') yanlış doğru doğru yanlış yanlış yanlış
   str ('1') str ("\ 0") doğru yanlış yanlış doğru yanlış yanlış
 str ('yanlış') str ("\ 0") doğru yanlış yanlış doğru yanlış yanlış
 str ('metin') str ("\ 0") doğru yanlış yanlış doğru yanlış yanlış
 str ('doğru') str ("\ 0") doğru yanlış yanlış doğru yanlış yanlış
   str ('') str ('+') yanlış doğru doğru yanlış yanlış yanlış
   str ('') str ('-') yanlış doğru doğru yanlış yanlış yanlış
   str ('') str ('0') yanlış doğru doğru yanlış yanlış yanlış
   str ('') str ('01 ') yanlış doğru doğru yanlış yanlış yanlış
   str ('') str ('1') yanlış doğru doğru yanlış yanlış yanlış
   str ('') str ('yanlış') yanlış doğru doğru yanlış yanlış yanlış
   str ('') str ('metin') yanlış doğru doğru yanlış yanlış yanlış
   str ('') str ('true') yanlış doğru doğru yanlış yanlış yanlış
   str ('-') str ('+') doğru yanlış yanlış doğru yanlış yanlış
   str ('+') str ('0') yanlış doğru doğru yanlış yanlış yanlış
   str ('+') str ('01 ') yanlış doğru doğru yanlış yanlış yanlış
   str ('1') str ('+') doğru yanlış yanlış doğru yanlış yanlış
 str ('yanlış') str ('+') doğru yanlış yanlış doğru yanlış yanlış
 str ('metin') str ('+') doğru yanlış yanlış doğru yanlış yanlış
 str ('doğru') str ('+') doğru yanlış yanlış doğru yanlış yanlış
   str ('-') str ('0') yanlış doğru doğru yanlış yanlış yanlış
   str ('-') str ('01 ') yanlış doğru doğru yanlış yanlış yanlış
   str ('1') str ('-') doğru yanlış yanlış doğru yanlış yanlış
 str ('yanlış') str ('-') doğru yanlış yanlış doğru yanlış yanlış
 str ('metin') str ('-') doğru yanlış yanlış doğru yanlış yanlış
 str ('doğru') str ('-') doğru yanlış yanlış doğru yanlış yanlış
   str ('0') str ('01 ') yanlış doğru doğru yanlış yanlış yanlış
   str ('1') str ('0') doğru yanlış yanlış doğru yanlış yanlış
 str ('yanlış') str ('0') doğru yanlış yanlış doğru yanlış yanlış
 str ('metin') str ('0') doğru yanlış yanlış doğru yanlış yanlış
 str ('doğru') str ('0') doğru yanlış yanlış doğru yanlış yanlış
 str ('yanlış') str ('01 ') doğru yanlış yanlış doğru yanlış yanlış
 str ('metin') str ('01 ') doğru yanlış yanlış doğru yanlış yanlış
 str ('doğru') str ('01 ') doğru yanlış yanlış doğru yanlış yanlış
   str ('1') str ('yanlış') yanlış doğru doğru yanlış yanlış yanlış
 str ('metin') str ('1') doğru yanlış yanlış doğru yanlış yanlış
 str ('doğru') str ('1') doğru yanlış yanlış doğru yanlış yanlış
 str ('metin') str ('yanlış') doğru yanlış yanlış doğru yanlış yanlış
 str ('doğru') str ('yanlış') doğru yanlış yanlış doğru yanlış yanlış
 str ('doğru') str ('metin') doğru yanlış yanlış doğru yanlış yanlış

$a > $b > $cMuamma ne zaman: $abüyük değil $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 (doğru)> str ('')> float (NAN)
A == C: bool (doğru)> str ('')> float (-INF)
A == C: bool (doğru)> str ('')> int (-1)
A == C: bool (doğru)> str ('')> float (-1)
A == C: bool (doğru)> dizi ()> float (NAN)
A == C: bool (true)> array ()> float (INF)
A == C: bool (doğru)> dizi ()> float (-INF)
A == C: bool (doğru)> dizi ()> str ('a')
A == C: bool (doğru)> dizi ()> int (1)
A == C: bool (doğru)> dizi ()> float (1)
A == C: bool (doğru)> dizi ()> str ('1')
A == C: bool (doğru)> dizi ()> str ('A')
A == C: bool (doğru)> dizi ()> int (-1)
A == C: bool (doğru)> dizi ()> float (-1)
A == C: bool (doğru)> int (0)> float (-INF)
A == C: bool (doğru)> int (0)> int (-1)
A == C: bool (doğru)> int (0)> float (-1)
A == C: bool (doğru)> str ('0')> float (NAN)
A == C: bool (doğru)> str ('0')> float (-INF)
A == C: bool (doğru)> str ('0')> int (-1)
A == C: bool (doğru)> str ('0')> float (-1)
A == C: bool (true)> float (0)> float (-INF)
A == C: bool (doğru)> float (0)> int (-1)
A == C: bool (doğru)> 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 (yanlış)
A == C: str ('')> int (-1)> NULL (NULL)
A == C: str ('')> int (-1)> bool (yanlış)
A == C: str ('')> float (-1)> NULL (NULL)
A == C: str ('')> float (-1)> bool (yanlış)
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: dizi ()> str ('a')> NULL (NULL)
A == C: dizi ()> str ('a')> bool (yanlış)
A == C: array ()> int (1)> NULL (NULL)
A == C: array ()> int (1)> bool (yanlış)
A == C: array ()> float (1)> NULL (NULL)
A == C: array ()> float (1)> bool (false)
A == C: dizi ()> str ('1')> NULL (NULL)
A == C: dizi ()> str ('1')> bool (yanlış)
A == C: dizi ()> str ('A')> NULL (NULL)
A == C: dizi ()> str ('A')> bool (yanlış)
A == C: dizi ()> str ('0')> NULL (NULL)
A == C: dizi ()> int (-1)> NULL (NULL)
A == C: array ()> int (-1)> bool (yanlış)
A == C: array ()> float (-1)> NULL (NULL)
A == C: array ()> float (-1)> bool (false)
A == C: str ('')> float (NAN)> bool (yanlış)
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 (yanlış)
A == C: int (0)> int (-1)> NULL (NULL)
A == C: int (0)> int (-1)> bool (yanlış)
A == C: int (0)> float (-1)> NULL (NULL)
A == C: int (0)> float (-1)> bool (yanlış)
A == C: str ('0')> float (NAN)> bool (yanlış)
A == C: str ('0')> float (-INF)> bool (yanlış)
A == C: str ('0')> int (-1)> bool (yanlış)
A == C: str ('0')> float (-1)> bool (yanlış)
A == C: float (0)> float (-INF)> NULL (NULL)
A == C: float (0)> float (-INF)> bool (yanlış)
A == C: float (0)> int (-1)> NULL (NULL)
A == C: float (0)> int (-1)> bool (yanlış)
A == C: float (0)> float (-1)> NULL (NULL)
A == C: float (0)> float (-1)> bool (yanlış)
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')

Eğlenceli dizi karşılaştırması: 'Kraliçe' >'Kral' >'Jack' >'As'

Ayrıca, çiftleri kapsayan PHP türü karşılaştırma tablolarına bakın :

  • isset() ve is_null()
  • if() ve empty()
  • boole ==ve===

PHP sürümleri arasındaki farkları adresinde kontrol edin. http://3v4l.org/MAfDu .


26
+1, sabit sütun başlıklarına sahip kaydırılabilir "tablolar" bir yana - şık fikir;)
hakre

Tip dökümünde katı bir operatör kullanılması gerekir mi? Demek istediğim yazdın if ( (string)$a===(string)$b )ama bu tam olarak aynı değil if ( (string)$a==(string)$b )mi?
Voitcus

Her iki tip döküm için evet @Voitcus (string)1==(string)'01'> - bool(true)ve tip-aldatarak için (1 . '')=='01'-> bool(true)değil tam aynı ===alacağınız zaman bool(false)hem hesaplarında
CSᵠ

1
Bir nit-pick: sekizlik değerler "atama sırasında dönüştürülmez", ASCII'yi gerçek ikili sayılara dönüştürmek zorunda olan derleyici tarafından yorumlanırlar.
IMSoP

INFINITY is equal to INFINITY which is mathematically incorrect!kesinlikle tartışmalı bir ifadedir. Ayrıca NaN, bunun bildiğim herhangi bir programlama dilinde herhangi bir şeyden büyük, küçük veya herhangi bir şeye eşit olmadığını unutmayın .
DaveRandom

22

Sorunuzun ikinci bölümünü düzelttikten sonra o bölümün cevabını diğerlerine bırakıyorum. Sorunuzun ilk kısmına en şaşırtıcı cevabı vermek istiyorum, yani geçişsiz olan <ve >operatörlerinin bir örneği olup olmadığı . İşte burada.

Bunların hepsi true:

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

<Geçişli olsaydı ( $a < $b$b < $c$a < $c), son satır olurdu

"10" < "2"

ancak PHP nazik olmaya (?!) ve dizeleri mümkün olduğunca sayılar olarak yorumlamaya çalışır.

Görünüşe göre, yukarıdaki geçişsizlik nedeniyle, iki öğe olmadığında (ve hiçbir öğe NAN olmadığında) bile aynı öğeleri giriş sıralarına bağlı olarak farklı bir sırada sort()sıralayabilir . Buna , özü olan sort () 'i bir yorumda işaret ettim :==

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" )

1
önceki yorum, bu arada
sildiğim

Bunu şimdi sort()kaldırdık ;) Ve güzel yeni bir tablo, ilgili blog gönderisini yazarken pratik çıkarımlar için de seçtim En Büyük PHP Değeri . Cevabınız için tekrar teşekkürler.
hakre

usortMümkün olduğunda kullanılması gerektiği anlamına mı geliyor ?
Voitcus

2
@Voitcus: Sanırım demek istedin usort($arr, 'strcmp'). Bu çalışır (dizeler için elbette), ancak kullanmak en iyisidir sort($arr, SORT_STRING).
Walter Tross

@WalterTross Her zaman doğru olduğundan emin olmak için her zaman kendi işlevinizi kullanın (yalnızca dizeler için değil)
Voitcus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.