No php, 0 é tratado como vazio?

144

O código explicará mais:

$var = 0;

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

O resultado retorna "Está vazio". Eu pensei que empty () verificará se eu já defini a variável e tenho valor dentro. Por que ele retorna "Está vazio"?

mysqllearner
fonte
15
O @stereo emptyé talvez a função PHP mais útil, mas amplamente incompreendida. Aprenda como e quando usá-lo.
deceze
2
@stereo emptyé essencialmente uma abreviação de isset($var) && $var != false. Você deve estar segurando seu emptymuito estranho para dar um tiro no pé com isso. ; P
deceze
@stereo 1) Onde é "inconsistente"? Funciona como diz na lata. 2) Comparar fracamente uma variável falsesem acionar um erro de "variável indefinida" é inútil? Bem, acho que você nunca faz isso ... 3) Escolher a função errada em um contexto de segurança não significa que a função em si seja ruim, inútil ou inconsistente; significa apenas que alguém escolheu a função errada para o trabalho.
deceze
18
@ deceze - Se uma função é tão incompreendida como empty(), provavelmente tem o nome errado.
Martinstoeckli

Respostas:

189

http://php.net/empty

Os seguintes itens são considerados vazios:

  • "" (uma sequência vazia)
  • 0 (0 como um número inteiro)
  • 0,0 (0 como um flutuador)
  • "0" (0 como uma sequência)
  • NULO
  • FALSO
  • array () (um array vazio)
  • var $ var; (uma variável declarada, mas sem valor em uma classe)

Observe que esta é exatamente a mesma lista de uma coerção para booleano false. emptyé simplesmente !isset($var) || !$var. Tente em issetvez disso.

deceze
fonte
Então, devo verificar assim: if (isset ($ var) && $ var! = 0) {Do Something} ??
Mysqllearner
1
@ mysql Neste caso, você também pode usar !empty($var), mas observe que não é o mesmo que você escreveu na pergunta. O que usar depende inteiramente de quais valores você deseja considerar true. Basta comparar as diferenças entre issete emptye escolher a combinação certa para a situação certa.
deceze
7
@mysqllearner: issetretorna Truese $var=0. Mas o que você quer dizer com if(isset($var) && $var != 0)é o mesmo que:empty
Felix Kling
O @mysqllearner isset detecta se NÃO está vazio. para verificar se está vazio, use! isset.
1
@Deji Como o PHP tem suas raízes como linguagem da Web, e os valores nas solicitações HTTP sempre são strings, '0'estão sendo tratados como equivalentes 0. Essa é uma filosofia de design principal do PHP. Concordo que esta é uma escolha extremamente discutível, no entanto, não estou aqui para debater essa escolha com você. Dentro da lógica do PHP, emptyo equivalente a == falsemenos avisos é bom para IMO. Que algumas coisas devam ser muito diferentes no PHP é um tópico diferente.
deceze
76

Fiquei me perguntando por que ninguém sugeriu a tabela de comparação de tipos extremamente útil . Responde a todas as perguntas sobre as funções comuns e compara operadores.

Um trecho:

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 com outras folhas de dicas, eu sempre mantenho uma cópia impressa desta tabela em minha mesa, caso não tenha certeza

Dan Soap
fonte
2
você deve atualizar sua folha de fraude agora vou dar-lhe um pouco mais ... 0.0 = true, 0,00 = true, "0.0" = false
Sayed Mohd Ali
34

No caso de valores numéricos, você deve usar a função is_numeric:

$var = 0;

if (is_numeric($var))
{
  echo "Its not empty";
} 
else 
{
    echo "Its empty";
}
Khandad Niazi
fonte
1
Solução
12

Use em strlen()vez disso. Corri para o mesmo problema usando 1/0 como valores possíveis para algumas variáveis. Estou usando if (strlen($_POST['myValue']) == 0)para testar se há um caractere ou não na minha variável.

Calin Rusu
fonte
basta adicionar um @strlen para omitir o log de erros, apenas no caso de ... para não criar um log grande #
Miguel Miguel
Por que você colocaria @strlen. Contanto que você passe uma variável, ela não deve gerar um erro. Se o seu strlen é esvaziar ele irá gravar o valor como 0.
sketchthat
2
Se a variável não estiver definida, acredito que você receberá um erro.
Evren Yurtesen
11

Recentemente, eu fui pego de calças nessa também. O problema com o qual lidamos frequentemente são variáveis ​​não definidas - digamos, um elemento de formulário que pode ou não estar lá, mas para muitos elementos 0(ou a string'0' que passaria pelo post com mais precisão, mas ainda seria avaliada como "falsey") ) é um valor legítimo, digamos em uma lista suspensa.

usar empty()primeiro e depois strlen()é o melhor possível, se você precisar disso também, como:

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

Do ponto de vista linguístico, o vazio tem um significado sem valor . Como os outros disseram, você precisará usar isset()para verificar se uma variável foi definida, e é isso que você faz.

Elzo Valugi
fonte
1
Esta resposta simples me ajudou a esclarecer uma questão 0versus nullcom facilidade. Obrigado!
precisa saber é o seguinte
4

empty()retorna true para tudo o que é avaliado FALSE, na verdade é um 'não' ( !) disfarçado. Eu acho que você quis dizerisset()

soulmerge
fonte
4

Para aceitar 0 como um valor na variável use isset

Verifique se a variável está vazia

$var = 0;

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

Verifique se a variável está definida

$var = 0;

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

Está trabalhando para mim!

//
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
fonte
1

Os seguintes itens são considerados vazios:

  • "" (uma sequência vazia)
  • 0 (0 como um número inteiro)
  • "0" (0 como uma sequência)
  • NULO
  • FALSO
  • array () (um array vazio)
  • var $ var; (uma variável declarada, mas sem valor em uma classe)

Do manual do PHP

No seu caso $varé 0, por isso empty($var)vai voltar true, você está negando o resultado antes de testá-lo, de modo que o bloco else será executado dando " Its empty" como saída.

codaddict
fonte
1

Do manual: Retorna FALSE se var tiver um valor não vazio e diferente de zero.

Os seguintes itens são considerados vazios:

  • "" (uma sequência vazia)
  • 0 (0 como um número inteiro)
  • "0" (0 como uma sequência) NULL
  • FALSE array () (um array vazio) var
  • $ var; (uma variável declarada, mas sem valor em uma classe)

Mais: http://php.net/manual/en/function.empty.php

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

No meu caso, esse código funcionou.

Cherrish
fonte
0

Na verdade, isset apenas verifique se a variável está configurada ou não.Neste caso, se você deseja verificar se sua variável é realmente zero ou vazia, você pode usar este exemplo:

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

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

apenas para aviso $ myVar == 0 age como uma função vazia.

arash
fonte
0

Vazio deve significar vazio ... o que deceze diz.

Quando eu faço

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

Eu espero isso var_dump(empty($var)); retorne falso.

se você estiver verificando as coisas em uma matriz, sempre precisará fazer isset($var)primeiro.

Paul Wolbers
fonte
0

use apenas em ($_POST['input_field_name'])!=0vez de !($_POST['input_field_name'])==00 não é tratado como vazio.

Manish Sharma
fonte
0

Não tenho certeza se ainda há pessoas procurando uma explicação e uma solução. Os comentários acima dizem tudo sobre as diferenças entre VERDADEIRO / FALSO / 1 / 0.
Gostaria apenas de trazer meus 2 centavos para a maneira de exibir o valor real.

BOLEANO

Se você estiver trabalhando com um tipo de dados booleano, estará procurando um resultado VERDADEIRO vs. FALSO; se você armazená-lo no MySQL, ele será armazenado como 1 resp. 0 (se não me engano, é o mesmo na memória do seu servidor).

Portanto, para exibir o valor em PHP, você precisa verificar se é verdadeiro (1) ou falso (0) e exibir o que quiser: "TRUE" ou "FALSE" ou, possivelmente, "1" ou "0".
Atenção, tudo maior (ou diferente) que 0 também será considerado VERDADEIRO no PHP. Por exemplo: 2, "abc", etc. retornarão VERDADEIRO.

BIT, TINYINT

Se você estiver trabalhando com um tipo de dados numérico, a maneira como ele é armazenado é a mesma.
Para exibir o valor, você precisa dizer ao PHP para manipulá-lo como um número. A maneira mais fácil que encontrei é multiplicá-lo por 1.

Alex Tanner
fonte
0

exemplo apropriado. basta criar o campo int type (exemplo número de celular) no banco de dados e enviar um valor em branco para o banco de dados a seguir através de um formulário ou apenas inserir usando SQL. o que será salvo no banco de dados 0 porque é do tipo int e não pode ser salvo como em branco ou nulo. portanto, ele está vazio, mas será salvo como 0. portanto, quando você busca dados através do PHP e verifica os valores vazios. é muito útil e logicamente correto.

0,00, 0,000, 0,0000 .... 0,0 ... 0 também está vazio e o exemplo acima também pode ser usado para armazenar diferentes tipos de valores no banco de dados, como float, double, decimal (decimal tem variantes diferentes como 0,000 e assim por diante).

Sayed Mohd Ali
fonte
0

Você precisa usar isset () para verificar se o valor está definido.

Veershetty
fonte
Olá @Veershetty, bem-vindo ao Stack Overflow. Obrigado pela resposta, no entanto, parece não adicionar nada de novo às respostas mais detalhadas e existentes. Edite a resposta para adicionar detalhes que estão faltando em outras respostas ou considere excluir sua resposta se ela não adicionar nada novo.
Gricey 15/05/19