Pergunta

PHP tem o hábito de avaliar (int) 0 e (string) "0" como vazio quando utilizar a função empty(). Isso pode ter resultados inesperados se você espera valores numéricos ou de cordas de 0. Como posso "correção" que apenas retornar verdadeiro para esvaziar objetos, matrizes, cordas, etc?

Foi útil?

Solução

Isto não funcionou para mim.

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

Eu costumava vez:

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

Outras dicas

Eu raramente usam empty() para a razão que você descreve. Confunde valores legítimos com o vazio. Talvez seja porque eu faço um monte de trabalho em SQL, mas eu prefiro usar NULL para indicar a ausência de um valor.

PHP tem uma função que is_null() testes para uma variável ou expressão sendo 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";

Você também pode usar a exatamente igual === operador para fazer um teste semelhante:

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

Isso é verdade se $foo é NULL, mas não se é false, zero, "", etc.

"0" é sempre considerado falsa (ou vazio) em PHP, e isso faz muito sentido (não que eu vou argumentar que aqui). Se você quiser ter zero avaliar a verdade, bem como, o uso strlen($value).

"Fixação" é um ponto de vista. Outra seria a de assumir que não é "quebrado", e aprender a trabalhar com ela, a forma como foi concebido intencionalmente.

Dado o problema, como você descrevê-lo, a melhor coisa seria para reforçar seu código para a variável não pode ser colocado em um estado de tipo indeterminado. Caso contrário, você vai querer testar para tipo de dados usando gettype ().

Eu sempre adicionar à minha base de código

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

e usá-lo em vez de vazio (). Ele resolve a questão de manter zeros (int, float ou string) como não-vazia.

http://www.php.net/manual/en /function.empty.php#103756 que foi adicionado Maio de 2011.

De um modo geral você quer usar o operador iguais triplo para determinar quando um valor verdadeiramente é nulo ou falso. Esta é mais específico e os resultados Sempre retornar exatamente como esperado.

Criação de uma função separada para fazer algo que você pode fazer em uma única linha de código, mas usando um operador diferente parece ser excessivamente complicado e acrescenta ofuscamento adicional.

Além disso, muitos programadores tendem a usar 0 ou uma string vazia para denotar um valor inexistente, mas é mais correto (e eu sinto uma prática melhor) para usar um valor nulo para denotar qualquer valor (independentemente do tipo) que é verdadeiramente inexistente.

Eu uso isso para detectar vazio:

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

função:

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

Eu criei um IsEmpty() uma função rápida concisa.

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

Você está tentando usar empty() por algo que não está destinado. Pessoalmente, eu acho que é o comportamento vem de um paradigma de programação mais velho em PHP e poderia provavelmente ser aposentado.

Em vez disso, fazer suas verificações mais explícito. Em vez de verificar se o valor não é útil, verificar se é. Por exemplo, se você quiser um array, verificar que é um array (is_array()) ao invés de verificar se é um string.

Além disso, você pode contar com o fato de que todas as variáveis ??$_POST e $_GET são strings, assim você pode fazer comparações com "", ou verificar que strlen() == 0.

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

ord função para verificar tanto o valor passado estava vazio ou não .

/*
* 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;
}

A solução mais eficaz para este problema é testar se a variável é falsa por exemplo.


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

Não importa se a variável está vazio ou nulo, tudo igual a falsa quando colocado em um caso condicional.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top