2010-03-19 3 views
12

Ich habe vor kurzem ein seltsames Problem über in_array, das ich nicht verstehen kann. z.B.Ein Problem über in_array

$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"; 
} 

Ich lief es auf meine Lampe, und bekam

a bingo! 
b miss! 

ich das Handbuch lesen und stellen Sie den dritten Parameter $strict als true, dann ist es als expected.But gearbeitet bedeutet, dass ich immer Stellen Sie den strikten Parameter als wahr ein, wenn Sie in_array verwenden? Vorschläge wären willkommen.

Grüße

+0

Clear.Thanks alle. – Young

Antwort

17

Es bedeutet, dass Sie den dritten Parameter zu true setzen müssen, wenn Sie den Vergleich zu nicht nur Werte vergleichen wollen, aber auch Arten.

Sonst gibt es Typumwandlungen, während die Vergleiche - siehe String conversion to numbers, zum Beispiel.

als eine Angelegenheit der Tatsache, in_array ohne und mit streng nur der gleiche Unterschied, wie Sie zwischen == und ===haben werden - sieheComparison Operators.


Diese Konvertierung funktioniert meistens OK ... Aber nicht in dem Fall, dass Sie versuchen, 0 mit einer Zeichenfolge zu vergleichen, die mit einem Buchstaben beginnt: Die Zeichenfolge wird in eine Zahl konvertiert 0 als Wert

1

In Ihrem ersten Beispiel ist jeder Wert des Arrays $ a, wenn in numerische konvertiert, 0. Das ist, warum Ihr erstes Beispiel in "ein Bingo" resultiert.

Sie müssen den strict-Parameter nicht verwenden, wenn Sie wissen, dass Sie sich auf implizite Konvertierung verlassen oder dass Ihre Datentypen identisch sind (z. B. nach einem String in einem Array von Strings suchen). Andernfalls sollten Sie den Parameter strict verwenden, den Sie beim Vergleichen von zwei Werten, die vom gleichen Typ sein müssen, mit === anstelle von == verwenden sollten.

6

Der "Standard" -Modus in_array verwendet eine loose comparison wie die == comparison operator tut. Das heißt 0 wird wie folgt verglichen:

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

Nun ist die loose comparison operator == verwendet string conversion to integer bevor die Werte tatsächlich zu vergleichen:

Wenn Sie eine Zahl mit einem String-Vergleich oder der Vergleich beinhaltet numerischen Strings, dann wird jeder Die Zeichenfolge wird in eine Zahl umgewandelt und der Vergleich wird numerisch durchgeführt.

Und 'a', 'b' und 'c' alle 0 umgewandelt werden:

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

Aber wenn in_array im Strict-Modus (Set dritten Parameter wahr) verwendet wird, ein strict comparison (===) getan wird, dass beide Mittel der Wert und der Typ müssen gleich sein:

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

So wh de Verwenden Sie die in_array im strikten Modus, erhalten Sie das erwartete Ergebnis: