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