İn_Array'in ilgili bir sorun

3 Cevap php

I have got a strange problem about in_array recently which I cannot understand. e.g.

$a = array('a','b','c');
$b = array(1,2,3);

if (in_array(0,$a))
{
    echo "a bingo!\n";
}
else
{
    echo "a miss!\n";
}

if (in_array(0,$b))
{
    echo "b bingo!\n";
}
else
{
    echo "b miss!\n";
}

Benim lamba üzerinde koştu ve var

a bingo!
b miss!

Ben kılavuzunu okuyun ve üçüncü parametre kümesi $strict true, o expected.But olarak çalıştı ki ben her zaman ([{kullanırken gerçek olarak katı parametreyi ayarlamanız gerekir demek 2)]}? Öneriler duyacağız.

Selamlar

3 Cevap

Bu true when you want the comparison to not only compare values, but also types için üçüncü parametre ayarlamak zorunda kalıyoruz.

Örneğin, String conversion to numbers - bkz Else, karşılaştırmalar yaparken, dönüşümleri yazın var.

Nitekim olarak, in_array olmadan ve sıkı ile sadece the same difference as you'll have between === and === ` -- see Comparison Operators olduğunu.


This conversion, most of the time, works OK... But not in the case you're trying to compare 0 with a string that starts with a letter : the string gets converted to a numeric, which has 0 as value.

in_array is using a loose comparison == karşılaştırma operatörü gibi does. That means 0 bu gibi karşılaştırılır ve "default" modu:

var_dump(0 == 'a');  // bool(true)
var_dump(0 == 'b');  // bool(true)
var_dump(0 == 'c');  // bool(true)

Şimdi loose comparison operator == is using string conversion to integer aslında değerleri karşılaştırarak önce:

Bir dize ya da karşılaştırma sayısal dizeleri içeren bir dizi karşılaştırmak, sonra her dize bir sayıya dönüştürülür ve karşılaştırma sayısal gerçekleştirilir.

Ve 'a', 'b' ve 'c' tüm dönüştürülür 0,

var_dump((int) 'a');  // int(0)
var_dump((int) 'b');  // int(0)
var_dump((int) 'b');  // int(0)

Kullanırken ama in_array sıkı modunda değeri ve tipi hem anlamına gelir, bir strict comparison (===) yapılır, (true, üçüncü parametre seti) eşit olmalıdır:

var_dump(0 === 'a');  // bool(false)
var_dump(0 === 'b');  // bool(false)
var_dump(0 === 'c');  // bool(false)

in_array sıkı modunda kullanırken Yani, beklenen sonucu alıyoruz:

var_dump(in_array(0, $a, true));  // bool(false)

Sayısal dönüştürüldüğünde ilk örnekte, dizi $ a her değer, 0 olduğunu. Yani "bir bingo" in neden ilk örneği sonuçlar bulunuyor.

Eğer örtük dönüştürme güvenmek biliyorum sıkı parametresini kullanmak zorunda, ya da veri türleri (örneğin, dize bir dizide bir dize ararken) aynı olduğunu bilmiyorum. Aynı türde olmalıdır iki değerleri karşılaştırırken Aksi takdirde sıkı parametreyi yerine == ve === kullanmanız gereken aynı kullanmanız gerekir.