in_array()
Aprende cómo in_array() de PHP comprueba si un valor existe en un array, cómo funciona la comparación estricta y los errores de tipos que debes evitar.
Qué hace in_array()
in_array() comprueba si un valor determinado existe en algún lugar de un array y devuelve un boolean: true si el valor se encuentra, false si no. Busca en los valores del array (no en sus claves), lo que la convierte en la función predilecta para preguntas como "¿está permitida esta opción?" o "¿ya se ha añadido este usuario a la lista?".
Esta página cubre la firma de la función, cómo la comparación flexible frente a la estricta cambia el resultado, los errores de tipo que confunden a los desarrolladores, y cuándo usar una función diferente.
Sintaxis
in_array(mixed $needle, array $haystack, bool $strict = false): bool| Parámetro | Descripción |
|---|---|
$needle | El valor a buscar. |
$haystack | El array en el que buscar. |
$strict | Cuando es true, los tipos también deben coincidir (usa === en lugar de ==). Por defecto es false. |
La función devuelve true si $needle se encuentra en $haystack, de lo contrario false.
Ejemplo básico
<?php
$fruits = ["apple", "banana", "orange"];
if (in_array("banana", $fruits)) {
echo "Found!";
} else {
echo "Not found.";
}
// Output: Found!in_array() distingue entre mayúsculas y minúsculas para strings — "Apple" no coincidiría con "apple":
Comparación flexible vs. estricta
Por defecto in_array() utiliza comparación flexible (==), por lo que valores de distintos tipos pueden coincidir. Pasa true como tercer argumento para exigir una coincidencia exacta de tipo (===):
<?php
$numbers = [1, 2, 3, 4];
// Loose: the string "1" equals the integer 1
var_dump(in_array("1", $numbers)); // bool(true)
// Strict: "1" (string) is not identical to 1 (int)
var_dump(in_array("1", $numbers, true)); // bool(false)Utiliza el modo estricto siempre que tu array mezcle tipos, o cuando coincidir con el tipo incorrecto sería un error — por ejemplo, al comprobar un ID proporcionado por el usuario contra una lista de IDs enteros.
El error de conversión de tipos
La comparación flexible puede producir resultados sorprendentes. Un ejemplo clásico busca una cadena vacía o 0 en una lista de strings:
<?php
$values = [0, "", "foo", "bar"];
var_dump(in_array("0", $values)); // bool(true) — "0" == 0
var_dump(in_array("0", $values, true)); // bool(false) — different typesAquí "0" (string) es equivalente en comparación flexible al entero 0 que ya está en el array, por lo que la búsqueda flexible devuelve true. El modo estricto elimina la ambigüedad.
Nota: PHP 8 cambió la forma en que se comparan strings y números. En PHP 7,
in_array(0, ["foo", "bar"])devolvíatrueporque"foo"se convertía a0. En PHP 8+ la misma llamada devuelvefalse. En caso de duda, pasa$strict = true.
Obtener la posición en lugar de true/false
in_array() solo te dice si existe un valor. Si también necesitas su clave, usa array_search() — devuelve la clave si tiene éxito y false si falla:
<?php
$fruits = ["apple", "banana", "orange"];
$key = array_search("banana", $fruits);
var_dump($key); // int(1)Para comprobar si existe una clave concreta (no un valor), usa array_key_exists() o isset() en su lugar.
Cuándo usar una función diferente
- ¿Necesitas la posición del valor coincidente? →
array_search() - ¿Comprobando una clave en lugar de un valor? →
array_key_exists()oisset() - ¿Filtrando un array para obtener los elementos que coinciden? →
array_filter() - ¿Buscando en un array muy grande repetidamente? Conviértelo a claves con
array_keys()y usaisset(), que es más rápido que escanear conin_array().
Resumen
in_array($needle, $haystack)devuelvetrue/falsesegún si un valor existe en un array.- Busca valores, distingue entre mayúsculas y minúsculas para strings, y usa comparación flexible por defecto.
- Pasa
truecomo tercer argumento para la comparación estricta (con tipos) — preferida cuando los tipos importan. - Usa
array_search()cuando necesites la clave, yarray_key_exists()/isset()cuando compruebes claves.