2009-04-09 18 views
22

Duplicar posible:
Fixing the PHP empty functionPHP: ¿cuál es una alternativa a empty(), donde la cadena "0" no se trata como vacía?

En PHP, vacía() es un gran atajo, ya que le permite comprobar si una variable está definida y no está vacío al mismo tiempo.

¿Qué utilizarías cuando no quieres que "0" (como una cadena) se considere vacío, pero igual quieres que sea falso, nulo, 0 y "" tratado como vacío?

Es decir, que estoy preguntando si usted tiene su propio acceso directo para esto:

if (isset($myvariable) && $myvariable != "") ;// do something 
if (isset($othervar ) && $othervar != "") ;// do something 
if (isset($anothervar) && $anothervar != "") ;// do something 
// and so on, and so on 

No creo que pueda definir una función de ayuda para esto, ya que la variable puede ser indefinido (y por lo tanto, no se pudo pasar como parámetro).

+0

Creo que ahora me doy cuenta de que no hay solución para esto, al menos no uno que pueda acortar este código. – thomasrutter

+0

Hmm. De acuerdo contigo – mysqllearner

Respuesta

1

La respuesta a esto es que no es posible acortar lo que ya tengo.

Suprimir avisos o advertencias no es algo que deba tener que hacer, por lo que siempre tendré que verificar si está vacío() o isset() antes de verificar el valor, y no puede verificar si algo está vacío() o isset() dentro de una función.

3
 
if ((isset($var) && $var === "0") || !empty($var)) 
{ 

} 

De esta manera se entra en el si-construir si la variable se establece y es "0", o si se establece la variable y no = null ("0", null, false)

+0

Esto parece bastante correcto; en realidad, no es un atajo para if (isset ($ misvariable) && $ myvariable! = ""), ya que es más largo. Gracias por la respuesta. – thomasrutter

21

Este debe hacer lo que quiera:

function notempty($var) { 
    return ($var==="0"||$var); 
} 

Editar: supongo tablas sólo funcionan en la vista previa, no en presentaciones reales de respuesta. Por lo tanto, consulte el PHP type comparison tables para obtener más información.

 
notempty("")  : false 
notempty(null)  : false 
notempty(undefined): false 
notempty(array()) : false 
notempty(false) : false 
notempty(true)  : true 
notempty(1)  : true 
notempty(0)  : false 
notempty(-1)  : true 
notempty("1")  : true 
notempty("0")  : true 
notempty("php") : true 

Básicamente, NotEmpty() es el mismo que! Empty() para todos los valores excepto "0", para lo cual devuelve verdadero .


Editar: Si está utilizando error_reporting (E_ALL), no podrá pasar una variable indefinida a funciones personalizadas por valor. Y como Mercator señala, debe siempre usar E_ALL para cumplir con las mejores prácticas. This link (comentario n. ° 11) que proporciona explica por qué no debe usar ninguna forma de supresión de errores por motivos de rendimiento y mantenimiento/depuración.

Consulte la respuesta de orlandu63 para saber cómo se pasan los argumentos a una función personalizada by reference.

+2

Eso fallará cuando la variable no esté definida. – mercator

+0

¿Qué quieres decir? Si se pasa una variable indefinida, la función devuelve falso, que es lo contrario de lo que devuelve empty(): http://us2.php.net/manual/en/types.comparisons.php Ese es el comportamiento deseado. – Calvin

+1

No falla, pero produce una advertencia. Entonces, aunque funciona, no es The Right Way (tm). Debería usar isset() antes de verificar la variable con === –

0
if(isset($var) && ($var === '0' || !empty($var))) 
{ 
} 
0
function Void($var) 
{ 
    if (empty($var) === true) 
    { 
     if (($var === 0) || ($var === '0')) 
     { 
      return false; 
     } 

     return true; 
    } 

    return false; 
} 
+0

Esto tiene el problema de que si $ var no está definido, falla tan pronto como se pasa como argumento (a una función que no sea isset o vacía, como su función Void). Creo que lo que quería es realmente imposible, lo siento. – thomasrutter

9
function isempty(&$var) { 
    return empty($var) || $var === '0'; 
} 

La clave es el operador &, que pasa a la variable por reference, creándolo si no existe.

+0

Pensamiento inteligente, ¿esto todavía no generaría un error (o advertencia, o aviso) si $ var no existe? – thomasrutter

+3

En realidad, esta función silenciosamente hace que una variable indefinida se defina (como nula), sin emitir ningún error o aviso de ningún tipo. – Brilliand

0

If ($ var!= nulo)

+0

Esto dará error si $ var no está definido. – thomasrutter

Cuestiones relacionadas