negar includes in_array exist array php arrays

includes - Php, in_array, 0 valor



php in_array function (4)

Este es el resultado de la comparación y el tipo de malabarismo .

La comparación floja significa que PHP está utilizando == no === al comparar elementos. == no compara que los dos tipos de variables son iguales, solo su valor, mientras que === asegurará que coincidan en tipo y valor (por ejemplo, compare 0 == FALSE y 0 === FALSE ).

Entonces, básicamente, su función in_array está comprobando:

0 == ''Bye'' 0 == ''Hey'' 0 == 77

Tenga en cuenta que el 52 se perderá debido a la forma en que creó su matriz.

Por lo tanto, tenga en cuenta que si lo hace:

print (0 == ''Bye'');

Obtendrá 1. Aparentemente, PHP es un tipo que hace malabares con el ''Adiós'' a 0, que es lo mismo que sucederá cuando lance una cadena a un int, por ejemplo (int) ''string'' será igual a 0. Referencia específica del Conversión de cadenas a números doc (énfasis añadido):

El valor viene dado por la parte inicial de la cadena. Si la cadena comienza con datos numéricos válidos, este será el valor utilizado. De lo contrario, el valor será 0 (cero) . Los datos numéricos válidos son un signo opcional, seguido de uno o más dígitos (que contienen opcionalmente un punto decimal), seguido de un exponente opcional. El exponente es una ''e'' o ''E'' seguida de uno o más dígitos.

Aparentemente, el tipo de entero tiene prioridad sobre el tipo de cadena (es decir, podría hacer la comparación con la misma facilidad al convertir el int 0 en una cadena, que luego devolvería False). Esto se especifica en el documento de operadores de comparación :

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

Gracias por una pregunta interesante que me llevó a investigar y aprender algo nuevo.

Estaba tratando de entender el comportamiento de in_array en el siguiente escenario:

$arr = array(2 => ''Bye'', 52, 77, 3 => ''Hey''); var_dump(in_array(0, $arr));

El valor devuelto de in_array() es boolean true . Como puede ver, no hay un valor igual a 0 , así que si alguien puede ayudarme a entender, ¿por qué la función devuelve verdadero?


Este es un problema conocido, según los comentarios en la documentación . Considere los siguientes ejemplos:

in_array(0, array(42)); // FALSE in_array(0, array(''42'')); // FALSE in_array(0, array(''Foo'')); // TRUE

Para evitar esto, proporcione el tercer parámetro, true , colocando la comparación en modo estricto que no solo comparará valores, sino también tipos:

var_dump(in_array(0, $arr, true));

Existen otras soluciones que no requieren que todas las verificaciones se coloquen en modo estricto:

in_array($value, $my_array, empty($value) && $value !== ''0'');

¿Pero por qué?

La razón detrás de todo esto es probable que las conversiones de cadena a número . Si intentamos obtener un número de "Bye", se nos da 0 , que es el valor que estamos solicitando para buscar.

echo intval("Bye"); // 0

Para confirmar esto, podemos usar array_search para encontrar la clave que está asociada con el valor coincidente :

$arr = array(2 => ''Bye'', 52, 77, 3 => ''Hey''); echo array_search(0, $arr);

En este caso, la clave devuelta es 2 , lo que significa que 0 se encuentra en la conversión de Bye a un entero.


Intente agregar un tercer parámetro true (modo estricto) a su llamada in_array .


in_array se supone que se utiliza en matrices indexadas ([0], [1], [2], etc.), no con un diccionario como lo ha definido (almacén de valores-clave).

Si desea verificar si su matriz $ arr incluye ''0'', intente utilizar la función PHP array_key_exists en su lugar: http://php.net/manual/en/function.array-key-exists.php .

var_dump(array_key_exists(0, $arr));