En php, ¿se trata 0 como vacío?

144

El código explicará más:

$var = 0;

if (!empty($var)){
echo "Its not empty";
} else {
echo "Its empty";
}

El resultado devuelve "Está vacío". Pensé que empty () verificará si ya configuré la variable y tengo valor dentro. ¿Por qué devuelve "Está vacío"?

mysqllearner
fuente
15
@stereo emptyes quizás la función PHP más útil pero ampliamente incomprendida. Aprenda cómo y cuándo usarlo.
deceze
2
@stereo emptyes esencialmente la abreviatura de isset($var) && $var != false. Debes estar sosteniendo tu emptymuy raro para dispararte en el pie con esto. ; P
deceze
@stereo 1) ¿Dónde es "inconsistente"? Funciona como dice en la lata. 2) ¿ falseEs inútil comparar libremente una variable sin activar un error de "variable indefinida"? Bueno, supongo que nunca haces esto ... 3) Elegir la función incorrecta en un contexto de seguridad no significa que la función en sí es mala, inútil o inconsistente; solo significa que alguien eligió la función incorrecta para el trabajo.
Fallecimiento
18
@deceze: si una función es tan ampliamente malentendida empty(), entonces probablemente tenga un nombre incorrecto.
martinstoeckli

Respuestas:

189

http://php.net/empty

Las siguientes cosas se consideran vacías:

  • "" (una cadena vacía)
  • 0 (0 como un entero)
  • 0.0 (0 como flotante)
  • "0" (0 como una cadena)
  • NULO
  • FALSO
  • array () (una matriz vacía)
  • var $ var; (una variable declarada, pero sin un valor en una clase)

Tenga en cuenta que esta es exactamente la misma lista que para una coerción a Boolean false. emptyes simplemente !isset($var) || !$var. Intenta en su issetlugar.

difunto
fuente
Entonces, debo verificar así: if (isset ($ var) && $ var! = 0) {Do Something} ??
mysqllearner
1
@mysql Para este caso, podría usarlo !empty($var), pero tenga en cuenta que eso no es lo mismo que escribió en la pregunta. Qué usar depende completamente de los valores que desea considerar true. Simplemente compare las diferencias entre issety emptyy elija la combinación correcta para la situación correcta.
deceze
77
@mysqllearner: issetdevuelve Trueif $var=0. Pero lo que quieres decir con if(isset($var) && $var != 0)es lo mismo queempty
Felix Kling
@mysqllearner isset detecta si NO está vacío. para verificar si está vacío, use! isset en su lugar.
1
@Deji Dado que PHP tiene sus raíces como lenguaje web, y los valores en las solicitudes HTTP son siempre cadenas, '0'se trata como equivalente a 0. Esa es una filosofía de diseño central de PHP. Estoy de acuerdo en que esta es una opción extremadamente discutible, sin embargo, no estoy aquí para debatir esa opción con usted. Dentro de la lógica de PHP, emptycomo equivalente a == falsemenos avisos está bien IMO. Que algunas cosas deberían ser muy diferentes en PHP de lo que son es un tema diferente.
Fallecimiento
76

Me preguntaba por qué nadie sugirió la extremadamente útil tabla de comparación de tipos . Responde a todas las preguntas sobre las funciones comunes y compara operadores.

Un fragmento:

Expression      | empty($x)
----------------+--------
$x = "";        | true    
$x = null       | true    
var $x;         | true    
$x is undefined | true    
$x = array();   | true    
$x = false;     | true    
$x = true;      | false   
$x = 1;         | false   
$x = 42;        | false   
$x = 0;         | true    
$x = -1;        | false   
$x = "1";       | false   
$x = "0";       | true    
$x = "-1";      | false   
$x = "php";     | false   
$x = "true";    | false   
$x = "false";   | false   

Junto con otras hojas de trucos, siempre guardo una copia impresa de esta tabla en mi escritorio en caso de que no esté seguro

Jabón Dan
fuente
2
deberías actualizar tu hoja de trucos ahora. Te daré un poco más ... 0.0 = verdadero, 0.00 = verdadero, "0.0" = falso
Sayed Mohd Ali
34

En el caso de valores numéricos, debe usar la función is_numeric:

$var = 0;

if (is_numeric($var))
{
  echo "Its not empty";
} 
else 
{
    echo "Its empty";
}
Khandad Niazi
fuente
1
Buena solución cuando necesita verificar con '0' o 0.
nicooo.
12

Usar en su strlen()lugar. Me encontré con el mismo problema usando 1/0 como valores posibles para algunas variables. Estoy usando if (strlen($_POST['myValue']) == 0)para probar si hay un carácter o no en mi variable.

Calin Rusu
fuente
simplemente agregue un @strlen para omitir el registro de errores, por si acaso ... para no crear un registro grande
Miguel
¿Por qué lo pondrías @strlen? Mientras pase una variable, no debería generar un error. Si su strlen es vaciar el sistema registra el valor como 0.
sketchthat
2
Si la variable no está configurada, creo que obtendrá un error.
Evren Yurtesen
11

Recientemente me atraparon con los pantalones bajados en este también. El problema que a menudo tratamos son las variables no definidas: digamos un elemento de formulario que puede o no haber estado allí, pero para muchos elementos, 0(o la cadena '0'que vendría a través de la publicación con mayor precisión, pero aún se evaluaría como "falsey" ) es un valor legítimo, por ejemplo, en una lista desplegable.

usar empty()primero y luego strlen()es lo mejor si necesita esto también, como:

if(!empty($var) && strlen($var)){
    echo '"$var" is present and has a non-falsey value!';
}
Oliver Williams
fuente
6

Desde un punto de vista lingüístico, el vacío tiene un significado sin valor . Como dijeron los demás, tendrá que usar isset()para verificar si se ha definido una variable, que es lo que hace.

Elzo Valugi
fuente
1
Esta respuesta simple me ayudó a aclarar un problema 0versus nullcon facilidad. ¡Gracias!
Giacomo1968
4

empty()devuelve verdadero para todo lo que se evalúa FALSE, en realidad es un 'no' ( !) disfrazado. Creo que quisiste decirisset()

soulmerge
fuente
4

Para aceptar 0 como valor en uso variable isset

Comprobar si la variable está vacía

$var = 0;

if ($var == '') {
    echo "empty";
} else {
    echo "not empty"; 
}
//output is empty

Compruebe si la variable está configurada

$var = 0;

if (isset($var)) {
    echo "not empty";
} else {    
    echo "empty";
}
//output is not empty
bhu1st
fuente
4

¡Me está funcionando!

//
if(isset($_POST['post_var'])&&$_POST['post_var']!==''){
echo $_POST['post_var'];
}

//results:
1 if $_POST['post_var']='1'
0 if $_POST['post_var']='0'
skip if $_POST['post_var']=''
Toan Nguyen Thai
fuente
1

Las siguientes cosas se consideran vacías:

  • "" (una cadena vacía)
  • 0 (0 como un entero)
  • "0" (0 como una cadena)
  • NULO
  • FALSO
  • array () (una matriz vacía)
  • var $ var; (una variable declarada, pero sin un valor en una clase)

Del manual de PHP

En su caso $vares 0, por empty($var)lo que volverá true, está negando el resultado antes de probarlo, por lo que el bloque else se ejecutará dando " Its empty" como salida.

codictorio
fuente
1

Del manual: Devuelve FALSE si var tiene un valor no vacío y no cero.

Las siguientes cosas se consideran vacías:

  • "" (una cadena vacía)
  • 0 (0 como un entero)
  • "0" (0 como una cadena) NULL
  • FALSE array () (una matriz vacía) var
  • $ var; (una variable declarada, pero sin un valor en una clase)

Más: http://php.net/manual/en/function.empty.php

Adam Kiss
fuente
1
if (empty($var) && $pieces[$var] != '0') {
//do something
}

En mi caso este código funcionó.

Cherrish
fuente
0

En realidad, solo verifique si la variable se establece o no. En este caso, si desea verificar si su variable es realmente cero o está vacía, puede usar este ejemplo:

$myVar = '';
if (empty($myVar))
{
  echo "Its empty";
}
echo "<br/>";

if ($myVar===0)
{
  echo "also zero!";
}

solo por aviso $ myVar == 0 actúa como una función vacía.

arash
fuente
0

vacío debería significar vacío ... digan lo que digan.

Cuando lo hago

$var = '';    
$var = '0';

Espero que var_dump(empty($var));vuelva falso.

Si está comprobando cosas en una matriz, siempre tiene que hacer isset($var)primero.

Paul Wolbers
fuente
0

usar solo en ($_POST['input_field_name'])!=0lugar de !($_POST['input_field_name'])==0entonces 0 no se trata como vacío.

Manish Sharma
fuente
0

No estoy seguro si todavía hay personas que buscan una explicación y una solución. Los comentarios anteriores lo dicen todo sobre las diferencias entre VERDADERO / FALSO / 1 / 0.
Me gustaría traer mis 2 centavos para mostrar el valor real.

Booleano

Si está trabajando con un tipo de datos booleano, está buscando un resultado VERDADERO vs. FALSO; si lo almacena en MySQL, se almacenará como 1 resp. 0 (si no me equivoco, esto es lo mismo en la memoria de su servidor).

Por lo tanto, para mostrar el valor en PHP, debe verificar si es verdadero (1) o falso (0) y mostrar lo que desee: "VERDADERO" o "FALSO" o posiblemente "1" o "0".
Atención, todo lo más grande (o diferente) que 0 también se considerará VERDADERO en PHP. Por ejemplo: 2, "abc", etc. devolverán VERDADERO.

BIT, TINYINT

Si está trabajando con un tipo de datos numérico, la forma en que se almacena es la misma.
Para mostrar el valor, debe decirle a PHP que lo maneje como un número. La forma más fácil que encontré es multiplicarlo por 1.

Alex Tanner
fuente
0

ejemplo apropiado simplemente cree un campo de tipo int (ejemplo, número de teléfono móvil) en la base de datos y envíe un valor en blanco para la siguiente base de datos a través de un formulario o simplemente inserte usando SQL. lo que se guardará en la base de datos 0 porque es de tipo int y no se puede guardar como en blanco o nulo. por lo tanto, está vacío, pero se guardará como 0. así que cuando obtenga datos a través de PHP y verifique los valores vacíos. Es muy útil y lógicamente correcto.

0.00, 0.000, 0.0000 .... 0.0 ... 0 también está vacío y el ejemplo anterior también se puede usar para almacenar diferentes tipos de valores en la base de datos como flotante, doble, decimal (los decimales tienen diferentes variantes como 0.000, etc.).

Sayed Mohd Ali
fuente
0

Debe usar isset () para verificar si el valor está configurado.

Veershetty
fuente
Hola @Veershetty, bienvenido a Stack Overflow. Gracias por su respuesta, sin embargo, no parece agregar nada nuevo sobre las respuestas existentes y más detalladas. Edite la respuesta para agregar detalles que faltan en otras respuestas o considere eliminar su respuesta si no agrega nada nuevo.
Gricey