¿Por qué una función que verifica si una cadena está vacía siempre devuelve verdadero? [cerrado]

231

Tengo una función isNotEmpty que devuelve verdadero si la cadena no está vacía y falsa si la cadena está vacía. Descubrí que no funciona si paso una cadena vacía a través de él.

function isNotEmpty($input) 
{
    $strTemp = $input;
    $strTemp = trim($strTemp);

    if(strTemp != '') //Also tried this "if(strlen($strTemp) > 0)"
    {
         return true;
    }

    return false;
}

La validación de la cadena usando isNotEmpty se realiza:

if(isNotEmpty($userinput['phoneNumber']))
{
    //validate the phone number
}
else
{
    echo "Phone number not entered<br/>";
}

Si la cadena está vacía, el resto no se ejecuta, no entiendo por qué, ¿alguien puede arrojar algo de luz sobre esto, por favor?

bgosalci
fuente
55
Solo una sugerencia: generalmente es una mala práctica usar funciones con nombres negados. Es más legible tener la función isEmpty ($ input), de lo contrario podría llamarlo así: if (! IsNotEmpty ($ x)) ... Por otro lado, isNotEmpty () y (! IsEmpty ()) no es que diferente YMMV.
johndodo
1
Para tener la misma función sin un nombre negado, tal vez algo como hasContent ().
OsakaWebbie
! thatDifferent @johndodo
coderatchet
Esta es DEFINITIVAMENTE una pregunta fuera de tema: error tipográfico .
mickmackusa

Respuestas:

320

Problema simple en realidad. Cambio:

if (strTemp != '')

a

if ($strTemp != '')

Posiblemente también quieras cambiarlo a:

if ($strTemp !== '')

dado != ''que volverá verdadero si pasa es numérico 0 y algunos otros casos debido a la conversión automática de tipo de PHP .

No debe usar la función vacía () incorporada para esto; ver comentarios y las tablas de comparación de tipos PHP .

cletus
fuente
44
Posiblemente, cambie el if a: return $ strTemp! == '';
extraño
12
no quieres usar empty (). Considere una cadena de espacios: $ x = ""; var_dump (! empty ($ x)); / * (TRUE) / var_dump (isNotEmpty ($ x)); / (FALSO) * /
nickf
55
El OP está recortando la cadena. En este caso es apropiado.
cletus
8
@cletus: luego considere una cadena $ s = '0'. Si llama vacío ($ s), se evaluará como verdadero (no es intuitivo, pero es así).
johndodo
28
¡No uses vacío ()! empty () devolverá verdadero para valores como '0'. Ver php.net/manual/en/types.comparisons.php
Scott Tesler
27

PHP tiene una función incorporada llamada empty() la prueba se realiza escribiendo if(empty($string)){...} Referencia php.net: php vacío

Malak
fuente
44
la referencia vacía ya está al final de la respuesta aceptada de cletus. Vea también que este hilo de preguntas y respuestas es de abril de 2009. De todos modos, gracias por su aporte. Te doy un +1 por la primera respuesta.
regilero
64
¡No uses vacío ()! empty () devolverá verdadero para valores como '0'. Ver php.net/manual/en/types.comparisons.php
Scott Tesler el
3
@ScottDavidTesler Si la cadena es "0", ¿devolverá verdadero? ¿O solo si es el entero 0?
Tomas Zubiri
55
@TomasZubiri Sí, una cadena que contiene "0" devolverá verdadero.
Michael Sund
3
POR FAVOR, nadie más votó esta respuesta INCORRECTA - ¡lea los comentarios anteriores!
ToolmakerSteve
24

Siempre uso una expresión regular para buscar una cadena vacía, que se remonta a los días CGI / Perl, y también con Javascript, entonces, ¿por qué no también con PHP, por ejemplo (aunque no probado)

return preg_match('/\S/', $input);

Donde \ S representa cualquier carácter que no sea un espacio en blanco

Dexygen
fuente
1
¡Esta es la única solución aquí que no asume que cero es lo mismo que una cadena vacía!
Matthew Lock
1
Solución genial Como nota al margen, stackoverflow.com/a/4544642/5411817 menciona: Por defecto ., no coincide con las nuevas líneas, [\s\S]es un truco para solucionar ese problema. Esto es común en JavaScript, pero en PHP puede usar la /sbandera para hacer que el punto coincida con todos los caracteres. Y stackoverflow.com/a/4544646/5411817 menciona: (?s)activa el smodo y (?-s)desactiva si está desactivado. Una vez desactivado, cualquier seguimiento .no coincidirá con una nueva línea. si desea activar / desactivar el interruptor en línea (incrustado dentro de la expresión regular) en lugar de como una bandera de expresión regular.
SherylHohman
19

En su ifcláusula en la función, se refiere a una variable strTempque no existe. $strTempexiste, sin embargo.

Pero PHP ya tiene una empty()función disponible; ¿Por qué hacer el tuyo?

if (empty($str))
    /* String is empty */
else
    /* Not empty */

Desde php.net:

Valores de retorno

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

Las siguientes cosas se consideran vacías:

* "" (an empty string)
* 0 (0 as an integer)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

http://www.php.net/empty

Björn
fuente
11
No todas las implementaciones querrían que "0" se evalúe como vacío. Y si él quisiera eso, ¿no podría usar la comparación if ($ x), es decir If (! Trim ($ str))?
Calvin el
1
Tenga en cuenta que hacer $ tmpStr! = '' También devolverá verdadero de $ tmpStr contiene 0 o falso u otro valor vacío / falso.
Pim Jager
55
Su versión no funcionará realmente: el vacío funciona en variables, no en expresiones.
Sabueso
13

PHP evalúa una cadena vacía como falsa, por lo que simplemente puede usar:

if (trim($userinput['phoneNumber'])) {
  // validate the phone number
} else {
  echo "Phone number not entered<br/>";
}
Troelskn
fuente
99
Esto funciona bien hasta que pase 0. De lo contrario, la idea es genial, la usaré en otros lugares. Gracias por su respuesta.
bgosalci 05 de
10

Solo usa la función strlen ()

if (strlen($s)) {
   // not empty
}
doctorlai
fuente
1
depende de cómo PHP implemente la función strlen (). Por ejemplo, en Delphi, la cadena en realidad ha almacenado su longitud menos 4 bytes de desplazamiento, por lo que verificar su longitud es trivial.
doctorlai
55
No escriba guardar. Antes de que Php 5.3la función regrese 5si $ses de tipo array. Php > 5.3surgirá una excepción. Recomiendo usar is_string($s) && str_len($s) > 0. >0solo para fines de lectura.
magic_al
5

Solo escribo mi propia función, is_string para la verificación de tipos y strlen para verificar la longitud.

function emptyStr($str) {
    return is_string($str) && strlen($str) === 0;
}

print emptyStr('') ? "empty" : "not empty";
// empty

Aquí hay una pequeña prueba repl.it

EDITAR: También puede usar la función de recorte para probar si la cadena también está en blanco.

is_string($str) && strlen(trim($str)) === 0;    
svarog
fuente
1

Necesitaba probar un campo vacío en PHP y usé

ctype_space($tempVariable)

que funcionó bien para mí

Tayman
fuente
Esta es una respuesta correcta a una pregunta diferente. Esta respuesta NO comprueba si una cadena está vacía.
mickmackusa
0

Bueno, aquí está el método corto para verificar si la cadena está vacía o no.

$input; //Assuming to be the string


if(strlen($input)==0){
return false;//if the string is empty
}
else{
return true; //if the string is not empty
}
abhishek bagul
fuente
Verificación strlen()fue recomendado en 2014 en esta página. Su respuesta no agrega ningún valor nuevo.
mickmackusa
0

Simplemente puede lanzar a bool, no olvide manejar cero.

function isEmpty(string $string): bool {
    if($string === '0') {
        return false;
    }
    return !(bool)$string;
}

var_dump(isEmpty('')); // bool(true)
var_dump(isEmpty('foo')); // bool(false)
var_dump(isEmpty('0')); // bool(false)
Fabian Picone
fuente
(bool)$stres lo mismo que hacer !empty($str), y tiene el mismo problema con '0'. Lea PHP Booleans , la sección "Convertir a booleano". Además, lo tienes al revés, debería ser !(bool)$string'. O su función debería llamarse "isNotEmpty". En cualquier caso, está atrapado con un manejo incorrecto de '0'.
ToolmakerSteve
@ToolmakerSteve Para el 0problema, simplemente maneje eso antes de devolver la cadena fundida. Y muchas gracias, olvidé la negación !(los nombres de funciones negadas son una mala práctica). Edité mi publicación.
Fabian Picone
-1

Sé que este hilo es bastante antiguo, pero solo quería compartir una de mis funciones. Esta función a continuación puede verificar cadenas vacías, cadenas con longitudes máximas, longitudes mínimas o longitud exacta. Si desea buscar cadenas vacías, simplemente ponga $ min_len y $ max_len como 0.

function chk_str( $input, $min_len = null, $max_len = null ){

    if ( !is_int($min_len) && $min_len !== null ) throw new Exception('chk_str(): $min_len must be an integer or a null value.');
    if ( !is_int($max_len) && $max_len !== null ) throw new Exception('chk_str(): $max_len must be an integer or a null value.'); 

    if ( $min_len !== null && $max_len !== null ){
         if ( $min_len > $max_len ) throw new Exception('chk_str(): $min_len can\'t be larger than $max_len.');
    }

    if ( !is_string( $input ) ) {
        return false;
    } else {
        $output = true;
    }

    if ( $min_len !== null ){
        if ( strlen($input) < $min_len ) $output = false;
    }

    if ( $max_len !== null ){
        if ( strlen($input) > $max_len ) $output = false;
    }

    return $output;
}
Kevin Ng
fuente
-2

tal vez puedas probar esto

if(isNotEmpty($userinput['phoneNumber']) == true)

eso se debe a la configuración de php en php.ini

0xFF
fuente
-2

si tiene un campo llamado serial_number y desea marcar vacío, entonces

$serial_number = trim($_POST[serial_number]);
$q="select * from product where user_id='$_SESSION[id]'";
$rs=mysql_query($q);
while($row=mysql_fetch_assoc($rs)){
if(empty($_POST['irons'])){
$irons=$row['product1'];
}

de esta manera, puede revisar todos los archivos en el bucle con otra función vacía

usuario2042007
fuente
empty()ya estaba recomendado en esta página en 2009.
mickmackusa
-2

Esta es la solución corta y efectiva, exactamente lo que estás buscando:

return $input > null ? 'not empty' : 'empty' ;
Moti Winkler
fuente
No he probado si esto funciona, pero si lo hace, sería mediante la conversión nulla una cadena vacía para la comparación. En cuyo caso, sería mucho más claro decir lo que quiere decir: $input > ''. Es decir, "realice una comparación léxica entre la cadena de entrada y una cadena vacía". O hacer caso omiso de los espacios en blanco en los extremos: trim($input) > ''.
ToolmakerSteve
... También es necesario probar lo que sucede cuando $inputes '0'. No está claro si php hace una numerico lexicalcomparación, cuando el primer argumento es una cadena numérica.
ToolmakerSteve
-3

Tienes una respuesta pero en tu caso puedes usar

return empty($input);

o

return is_string($input);
geekido
fuente
55
esto no funciona paraempty("0")
activatedgeek
2
@geekido: rechazar las respuestas incorrectas forma parte de StackOverflow: mueve esas respuestas hacia abajo y alienta a los que responden a corregirlas o eliminarlas. ¿Entiendes lo que está mal con tu respuesta? 1. empty- esta respuesta ya se ha dado, por lo que decirla nuevamente no aporta nada. Peor aún, como se ha discutido en los comentarios, está mal: cualquier valor equivalente a 0se considerará "vacío". 2. is_stringestá equivocado de una manera diferente: una cadena vacía ''es una cadena, por lo que devolverá verdadero en ese caso, no puede hacer lo que hace la pregunta.
ToolmakerSteve