2010-03-19 13 views
12

Tengo un problema extraño acerca de in_array recientemente que no puedo entender. p.Un problema sobre 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"; 
} 

lo corrió en mi lámpara, y tiene

a bingo! 
b miss! 

He leído el manual y establezca el tercer parámetro $strict como true, entonces trabajó como expected.But quiere decir que siempre necesito establece el parámetro estricto como verdadero al usar in_array? Las sugerencias serían apreciadas.

Saludos

+0

Borrar.Gracias a todos. – Young

Respuesta

17

Esto significa que usted tiene que fijar el tercer parámetro a true cuando se desea que la comparación con no sólo comparar los valores, sino también tipos.

De lo contrario, hay conversiones de tipo, al hacer las comparaciones, consulte String conversion to numbers, por ejemplo.

Como cuestión de hecho, in_array sin y con estricta es sólo la misma diferencia que tendrá entre == y ===- ver Comparison Operators.


Esta conversión, la mayoría de las veces, funciona bien ... Pero no en el caso de que intente comparar 0 con una cadena que comienza con una letra: la cadena se convierte a un valor numérico, que tiene 0 como valor

1

En su primer ejemplo, cada valor de la matriz $ a, cuando se convierte a numérico, es 0. Es por eso que su primer ejemplo da como resultado "un bingo".

No tiene que usar el parámetro estricto si sabe que confía en la conversión implícita o que sus tipos de datos son los mismos (por ejemplo, buscar una cadena en una matriz de cadena). De lo contrario, debe usar el parámetro estricto, el mismo que debería usar === en lugar de == cuando compare dos valores que deben ser del mismo tipo.

6

El modo "predeterminado" de in_array usa un loose comparison como el == comparison operator. Eso significa 0 se compara así:

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

Ahora el loose comparison operator == está utilizando string conversion to integer antes de que realmente la comparación de los valores:

Si se compara un número con una cuerda o la comparación incluye cadenas numéricas, entonces cada la cadena se convierte en un número y la comparación se realiza numéricamente.

Y 'a', 'b' y 'c' son todos convertidos a 0:

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

Pero cuando se utiliza in_array en modo estricto (establecido tercer parámetro a cierto), un strict comparison (===) se hace, que significa a la vez el valor y el tipo deben ser iguales:

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

So wh es usando el in_array en modo estricto, está obteniendo el resultado esperado:

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