empty($var) devuelve true si la variable no existe o su valor es falsy: null, false, 0, 0.0, "", "0" o un array vacío []. Para cualquier otro valor devuelve false. Igual que isset(), nunca avisa de variables o claves de array no definidas.
empty($x) es lo mismo que !isset($x) || !$x. Dicho de otra forma: falta, o se convierte en false.
Qué valores están vacíos
Elige un valor en la tabla para ver empty() junto a isset() y el cast (bool). Cada celda la calculó PHP 8.3.
| $x | empty | isset | bool |
|---|---|---|---|
| null | |||
| false | |||
| 0 | |||
| 0.0 | |||
| "" | |||
| "0" | |||
| [] | |||
| " " | |||
| "0.0" | |||
| "a" | |||
| "null" | |||
| [0] | |||
| 1 | |||
| -1 |
Las sorpresas están en los dos extremos: "0" está vacío, mientras que " " (un espacio), "0.0", "null" y [0] no lo están.
"0" está vacío: el bug clásico
Como "0" es falsy, empty() trata una cantidad de 0, una puntuación de 0 o un PIN "0" como "no se ha escrito nada". Esto muerde en los formularios, donde todos los valores llegan como cadenas.
Para la entrada de texto, la comprobación fiable de "no se ha escrito nada" es trim($value) === "". Deja empty() para los valores en los que 0 realmente significa nada.
Comprobar si una cadena está vacía
Para comprobar exactamente una cadena vacía, compara con "". Para tratar también los espacios como vacío, aplica antes trim. Desde PHP 5.5 empty() acepta expresiones, así que empty(trim($s)) también funciona (pero tiene el mismo problema con "0").
trim() no acepta null sin un aviso de obsolescencia desde PHP 8.1, y por eso el bloque escribe trim($s ?? "").
Comprobar si un array está vacío
Con arrays, empty($arr), $arr === [] y count($arr) === 0 dan la misma respuesta. empty() tiene la ventaja de funcionar con una variable o una clave que puede no existir.
array_filter() sin callback elimina todos los valores falsy, así que es una forma rápida de preguntar "¿este array contiene algo de verdad?".
Validar un campo de formulario obligatorio
!empty() es una forma habitual de exigir un campo, siempre que 0 no sea una respuesta válida. Ejecuta este bloque, deja los campos en blanco y pulsa Send; después rellénalos y envíalo otra vez: el script se ejecuta de nuevo con $_POST lleno.
empty($_POST["terms"]) cubre los dos casos de la casilla: no enviada en absoluto, o enviada con un valor vacío. La página de formularios va más allá con mensajes de error por campo.
empty vs isset
Las dos son seguras con variables y claves no definidas. Responden a preguntas distintas:
isset($x): ¿existe y no esnull? Úsalo para claves opcionales, casillas y "¿se envió esto?".!empty($x): ¿existe y es truthy? Úsalo para "tiene algo de verdad", cuando0y"0"no cuentan.$x === ""o$x === []: ¿está exactamente vacío? Úsalo cuando0sea un valor válido.
La página de isset cubre la otra mitad, incluido isset() con varias variables a la vez y la diferencia con array_key_exists().
Preguntas frecuentes
¿Qué valores considera vacíos empty() en PHP?
empty($x) es true cuando $x no existe o es null, false, 0, 0.0, "", "0" o []. Todo lo demás no está vacío, incluidos " " (un espacio), "0.0", "false" y [0].
¿Por qué "0" está vacío en PHP?
empty() equivale a !$x sin el warning por variables no definidas, y la cadena "0" se convierte en false. Eso hace que empty() sea incorrecto para campos donde 0 es una respuesta válida; comprueba $x === '' o trim($x) === '' en su lugar.
¿Cómo compruebo si un array está vacío en PHP?
Funcionan empty($arr) y $arr === [], y también count($arr) === 0. empty() además devuelve true cuando la variable no está definida, mientras que count() con una variable no definida avisaría y después lanzaría un TypeError por el null.
¿Cuándo uso empty() en lugar de isset()?
Usa isset() cuando solo necesites saber que un valor existe (se envió una casilla, hay una clave de configuración). Usa !empty() cuando además el valor no deba estar en blanco, por ejemplo un campo de texto obligatorio. Cuidado con los campos donde 0 es válido, porque empty('0') es true.