In php, 0 viene considerato vuoto?


144

Il codice spiegherà di più:

$var = 0;

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

Il risultato restituisce "È vuoto". Ho pensato che empty () verificherà se ho già impostato la variabile e ho valore all'interno. Perché restituisce "È vuoto" ??


15
@stereo emptyè forse la funzione PHP più utile ma ampiamente fraintesa. Scopri come e quando usarlo.
Inganno

2
@stereo emptyè essenzialmente l'abbreviazione di isset($var) && $var != false. Devi essere emptymolto strano per spararti ai piedi con questo. ; P
inganno

@stereo 1) Dove si trova "incoerente"? Funziona come si dice sulla scatola. 2) Confrontare liberamente una variabile falsesenza attivare un errore "variabile non definita" è inutile? Vabbè, suppongo che non lo farai mai ... 3) Scegliere la funzione sbagliata in un contesto di sicurezza non significa che la funzione stessa sia cattiva, inutile o incoerente; significa solo che qualcuno ha scelto la funzione sbagliata per il lavoro.
Inganno


18
@deceze - Se una funzione è così ampiamente fraintesa come empty(), allora probabilmente ha un nome sbagliato.
martinstoeckli,

Risposte:


189

http://php.net/empty

Le seguenti cose sono considerate vuote:

  • "" (una stringa vuota)
  • 0 (0 come numero intero)
  • 0.0 (0 come float)
  • "0" (0 come stringa)
  • NULLO
  • FALSE
  • array () (un array vuoto)
  • var $ var; (una variabile dichiarata, ma senza un valore in una classe)

Nota che questo è esattamente lo stesso elenco di una coercizione booleana false. emptyè semplicemente !isset($var) || !$var. Prova issetinvece.


Quindi, devo controllare in questo modo: if (isset ($ var) && $ var! = 0) {Do Something} ??
mysqllearner,

1
@mysql Per questo caso potresti anche usare !empty($var), ma nota che non è lo stesso di quello che hai scritto nella domanda. Cosa usare dipende interamente da quali valori vuoi considerare true. Basta confrontare le differenze tra issete emptye scegliere la giusta combinazione per la giusta situazione.
Inganno

7
@mysqllearner: issetrestituisce Trueif $var=0. Ma quello che vuoi dire if(isset($var) && $var != 0)è lo stesso diempty
Felix Kling

@mysqllearner isset rileva se NON è vuoto. per verificare se è vuoto, utilizzare invece! isset.

1
@Deji Poiché PHP ha le sue radici come linguaggio web e i valori nelle richieste HTTP sono sempre stringhe, '0'viene trattato come equivalente 0. Questa è una filosofia progettuale fondamentale di PHP. Sono d'accordo che questa è una scelta estremamente discutibile, tuttavia, non sono qui per discutere questa scelta con te. All'interno della logica di PHP, emptycome equivalente a == falsemeno gli avvisi va bene IMO. Che alcune cose dovrebbero essere molto diverse in PHP di quanto non lo siano è un argomento diverso.
Inganno

76

Mi chiedevo perché nessuno avesse suggerito la tabella di confronto dei tipi estremamente utile . Risponde a tutte le domande sulle funzioni comuni e confronta gli operatori.

Uno snippet:

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   

Insieme ad altri trucchi, tengo sempre una copia di questo tavolo sulla mia scrivania nel caso non ne fossi sicuro


2
dovresti aggiornare il tuo cheat sheet ora ti darò un po 'di più ... 0.0 = true, 0.00 = true, "0.0" = false
Sayed Mohd Ali

34

In caso di valori numerici è necessario utilizzare la funzione is_numeric:

$var = 0;

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

1
Bella soluzione alternativa quando è necessario verificare con "0" o 0.
nicooo.

12

Usa strlen()invece. Ho riscontrato lo stesso problema utilizzando 1/0 come possibili valori per alcune variabili. Sto usando if (strlen($_POST['myValue']) == 0)per verificare se c'è un carattere nella mia variabile o no.


basta aggiungere un @strlen per omettere il registro degli errori, nel caso ... per non creare un registro di grandi dimensioni
Miguel

Perché dovresti metterlo @strlen. Fintanto che si passa una variabile non dovrebbe generare un errore. Se il tuo strlen è vuoto, registrerà il valore come 0.
abbozza quel

2
Se la variabile non è impostata, credo che otterrai un errore.
Evren Yurtesen,

11

Sono stato recentemente catturato con i pantaloni giù anche su questo. Il problema che affrontiamo spesso sono le variabili non impostate, ad esempio un elemento del modulo che potrebbe essere stato o meno lì, ma per molti elementi 0(o la stringa '0'che verrebbe attraversata dal post in modo più accurato, ma verrebbe comunque valutata come "falso" ) è un valore legittimo indicato in un elenco a discesa.

usare empty()prima e poi strlen()è il migliore se hai bisogno anche di questo, come:

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

6

Da un punto di vista linguistico, vuoto ha un significato senza valore . Come gli altri hanno detto che dovrai usare isset()per verificare se è stata definita una variabile, che è quello che fai.


1
Questa semplice risposta mi ha aiutato a chiarire con facilità un 0versus contro null. Grazie!
Giacomo1968,

4

empty()ritorna vero per tutto ciò che valuta FALSE, in realtà è un 'non' ( !) sotto mentite spoglie. Penso che volevi direisset()


4

Per accettare 0 come valore in uso variabile isset

Controlla se la variabile è vuota

$var = 0;

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

Controlla se la variabile è impostata

$var = 0;

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

4

Funziona per me!

//
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']=''

1

Le seguenti cose sono considerate vuote:

  • "" (una stringa vuota)
  • 0 (0 come numero intero)
  • "0" (0 come stringa)
  • NULLO
  • FALSE
  • array () (un array vuoto)
  • var $ var; (una variabile dichiarata, ma senza un valore in una classe)

Dal manuale di PHP

Nel tuo caso $varè 0, quindi empty($var)tornerà true, si sta negando il risultato prima del test, quindi il blocco else verrà eseguito dare " Its empty" come uscita.


1

Da manuale: restituisce FALSO se var ha un valore non vuoto e diverso da zero.

Le seguenti cose sono considerate vuote:

  • "" (una stringa vuota)
  • 0 (0 come numero intero)
  • "0" (0 come stringa) NULL
  • FALSE array () (un array vuoto) var
  • $ Var; (una variabile dichiarata, ma senza un valore in una classe)

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


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

Nel mio caso questo codice ha funzionato.


0

In realtà, è sufficiente verificare se la variabile si imposta o meno. In questo caso, se si desidera verificare se la variabile è davvero zero o vuota, è possibile utilizzare questo esempio:

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

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

solo per avviso $ myVar == 0 si comporta come una funzione vuota.


0

vuoto dovrebbe significare vuoto .. qualunque cosa dica l'inganno.

Quando io faccio

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

Mi aspetto che var_dump(empty($var));tornerà falso.

se stai controllando le cose in un array devi sempre isset($var)prima fare .


0

utilizzare solo ($_POST['input_field_name'])!=0anziché !($_POST['input_field_name'])==00 non viene considerato vuoto.


0

Non sono sicuro se ci sono ancora persone che cercano una spiegazione e una soluzione. I commenti sopra dicono tutto sulle differenze tra VERO / FALSO / 1 / 0.
Vorrei solo portare i miei 2 centesimi per il modo di visualizzare il valore reale.

BOOLEAN

Se stai lavorando con un tipo di dati booleano, stai cercando un risultato TRUE vs. FALSE; se lo memorizzi in MySQL, verrà memorizzato come 1 resp. 0 (se non sbaglio, questo è lo stesso nella memoria del tuo server).

Quindi per visualizzare il valore in PHP, devi verificare se è vero (1) o falso (0) e visualizzare quello che vuoi: "VERO" o "FALSO" o possibilmente "1" o "0".
Attenzione, tutto ciò che è più grande (o diverso) di 0 sarà considerato VERO in PHP. Ad esempio: 2, "abc", ecc. Restituiranno VERO.

BIT, TINYINT

Se lavori con un tipo di dati numerico, il modo in cui è memorizzato è lo stesso.
Per visualizzare il valore, devi dire a PHP di gestirlo come un numero. Il modo più semplice che ho trovato è moltiplicarlo per 1.


0

esempio corretto. basta creare un campo di tipo int (esempio numero di cellulare) nel database e inviare un valore vuoto per il seguente database tramite un modulo o semplicemente inserire usando SQL. cosa verrà salvato nel database 0 perché è di tipo int e non può essere salvato come vuoto o nullo. quindi è vuoto ma verrà salvato come 0. quindi quando recuperi i dati tramite PHP e controlli i valori vuoti. è molto utile e logicamente corretto.

0.00, 0.000, 0.0000 .... 0.0 ... 0 è anche vuoto e l'esempio sopra può anche essere usato per memorizzare diversi tipi di valori nel database come float, double, decimal (decimal ha diverse varianti come 0.000 e così via.


0

Devi usare isset () per verificare se il valore è impostato.


Ciao @Veershetty, benvenuto su Stack Overflow. Grazie per la risposta, tuttavia non sembra aggiungere nulla di nuovo rispetto alle risposte esistenti e più dettagliate. Modifica la risposta per aggiungere dettagli mancanti ad altre risposte o considera la possibilità di eliminare la risposta se non aggiunge nulla di nuovo.
Gricey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.