Pregunta

PHP tiene el hábito de evaluar (int) 0 y (cadena) " 0 " como vacío cuando se utiliza la función empty () . Esto puede tener resultados no deseados si espera valores numéricos o de cadena de 0. ¿Cómo puedo " corregir " ¿Solo devuelve verdadero a objetos vacíos, matrices, cadenas, etc.?

¿Fue útil?

Solución

Esto no funcionó para mí.

if (empty($variable) && '0' != $variable) {
  // Do something
}

He usado en su lugar:

if (empty($variable) && strlen($variable) == 0) {
  // Do something
}

Otros consejos

Raramente uso empty () por la razón que describe. Confunde los valores legítimos con el vacío. Tal vez sea porque hago mucho trabajo en SQL, pero prefiero usar NULL para denotar la ausencia de un valor.

PHP tiene una función is_null () que prueba si una variable o expresión es NULL .

$foo = 0;
if (is_null($foo)) print "integer 0 is null!\n"; 
else print "integer 0 foo is not null!\n";

$foo = "0";
if (is_null($foo)) print "string '0' is null!\n"; 
else print "string '0' is not null!\n";

$foo = "";
if (is_null($foo)) print "string '' is null!\n"; 
else print "string '' is not null!\n";

$foo = false;
if (is_null($foo)) print "boolean false is null!\n"; 
else print "boolean false is not null!\n";

También puedes usar el operador exactamente igual a === para hacer una prueba similar:

if ($foo === null) print "foo is null!\n";

Esto es cierto si $ foo es NULL , pero no si es false , cero, " " , etc.

" 0 " siempre se considera falso ( o vacío) en PHP, y tiene mucho sentido (no es que lo discutiré aquí). Si también desea que cero evalúe como verdadero, use strlen ($ value) .

" Fijación " Es un punto de vista. Otro sería asumir que no está "roto" y aprender a trabajar con él de la forma en que fue diseñado intencionalmente.

Dado el problema tal como lo describe, lo mejor sería ajustar su código para que la variable no pueda ponerse en un estado de tipo indeterminado. De lo contrario, querrá probar el tipo de datos utilizando gettype ().

Siempre agrego a mi código base

function is_blank($value) {
    return empty($value) && !is_numeric($value);
}

y úsalo en lugar de vacío (). Resuelve el problema de mantener los ceros (int, float o string) como no vacíos.

Consulte http://www.php.net/manual/en /function.empty.php#103756 que se agregó en mayo de 2011.

En términos generales, desea utilizar el operador de triple igual para determinar cuándo un valor es realmente nulo o falso. Esto es más específico y los resultados SIEMPRE se devuelven exactamente como se esperaba.

Crear una función separada para hacer algo que puede hacer en una sola línea de código, pero usar un operador diferente parece ser demasiado complicado y agrega una ofuscación adicional.

Además, muchos programadores tienden a usar 0 o una cadena vacía para denotar un valor inexistente, pero es más correcto (y creo que es una mejor práctica) usar un valor nulo para denotar cualquier valor (independientemente del tipo) que es verdaderamente inexistente.

Uso esto para detectar el vacío:

''  --> true
'0' --> false
0   --> false

la función:

function is_empty_or_zero($str) {
 return (is_null($str) || ($str === ''));
}

Creé una IsEmpty () una función rápida tersa.

function IsEmpty($mData) {
    return is_int($mData) ? false : 
        is_string($mData) ? $mData=="" : 
        empty($mData);
}

Estás intentando utilizar empty () para algo para lo que no está destinado. Personalmente, creo que su comportamiento proviene de un viejo paradigma de programación en PHP y probablemente podría retirarse.

En cambio, haz tus cheques más explícitos. En lugar de verificar si el valor no es útil, verifique que lo sea. Por ejemplo, si desea una matriz, verifique que sea una matriz ( is_array () ) en lugar de verificar si es una cadena.

Además, puede confiar en el hecho de que todas las variables $ _POST y $ _GET son cadenas, por lo que puede hacer comparaciones en " " ;, o verificar que strlen () == 0 .

if ( is_int($val) || !empty($val) ) {;}

Utilicé la función ord para verificar el valor pasado estaba vacío o no.

/*
* SPACE is not empty - Please do trim before using this function for your own purpose
*  var_dump(is_having_value(0));        // true
   var_dump(is_having_value(0000));     // true
   var_dump(is_having_value("    0"));  // true
   var_dump(is_having_value(""));       // false
   var_dump(is_having_value("  "));     // true
   var_dump(is_having_value('\t'));     // true
   var_dump(is_having_value(''));       // false
   var_dump(is_having_value('o'));      // true
   var_dump(is_having_value('O'));      // true
   var_dump(is_having_value('0'));      //true
   var_dump(is_having_value(null));     //false
   var_dump(is_having_value());         //false
*/
function is_having_value($val = null) {
    if (is_array($val) || is_object($val)):
        $logic_empty = empty($val);
        return !$logic_empty;
    else:
        $ascii = ord($val);
        if ($ascii == 48 || $ascii = 0 || $ascii == 32):
            return true;
        else:
            $logic_empty = empty($val);
            return !$logic_empty;
        endif;
    endif;
}

La solución más efectiva para este problema es probar si la variable es falsa, por ejemplo,


if (!$variable_name) {echo $variable_name;}

No importa si la variable está vacía o nula, todo es igual a falso cuando se coloca en un condicional.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top