Domanda

PHP ha l'abitudine di valutare (int) 0 e (stringa) " 0 " come vuoto quando si utilizza la funzione empty () . Ciò può avere risultati non previsti se si prevedono valori numerici o di stringa pari a 0. Come posso "correggere"? per restituire true solo a oggetti vuoti, array, stringhe, ecc.

È stato utile?

Soluzione

Questo non ha funzionato per me.

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

Ho usato invece:

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

Altri suggerimenti

Uso raramente empty () per il motivo che descrivi. Confonde i valori legittimi con il vuoto. Forse è perché lavoro molto in SQL, ma preferisco usare NULL per indicare l'assenza di un valore.

PHP ha una funzione is_null () che verifica che una variabile o espressione sia 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";

Puoi anche usare l'operatore esattamente uguale === per fare un test simile:

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

Questo è vero se $ foo è NULL , ma non se è false , zero, " " , ecc.

" 0 " è sempre considerato falso ( o vuoto) in PHP, e ha molto senso (non che lo discuterò qui). Se vuoi che anche zero valuti come vero, usa strlen ($ value) .

" fissaggio " è un punto di vista. Un altro sarebbe assumere che non sia "rotto", e imparare a lavorarci nel modo in cui è stato progettato intenzionalmente.

Dato il problema mentre lo descrivi, la cosa migliore sarebbe restringere il codice in modo che la variabile non possa essere messa in uno stato di tipo indeterminato. Altrimenti, ti consigliamo di testare il tipo di dati utilizzando gettype ().

Aggiungo sempre al mio codebase

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

e usalo al posto di empty (). Risolve il problema di mantenere gli zeri (int, float o string) come non vuoti.

Vedi http://www.php.net/manual/en /function.empty.php#103756 che è stato aggiunto a maggio 2011.

In generale, si desidera utilizzare l'operatore triple egals per determinare quando un valore è veramente nullo o falso. Questo è più specifico e i risultati SEMPRE ritornano esattamente come previsto.

Creare una funzione separata per fare qualcosa che puoi fare in una singola riga di codice ma usare un operatore diverso sembra essere eccessivamente complicato e aggiunge ulteriore offuscamento.

Inoltre, molti programmatori tendono a usare 0 o una stringa vuota per indicare un valore inesistente, ma è più corretto (e ritengo che sia una pratica migliore) utilizzare un valore nullo per indicare qualsiasi valore (indipendentemente dal tipo) che è veramente inesistente.

Uso questo per rilevare il vuoto:

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

la funzione:

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

Ho creato un IsEmpty () una funzione rapida concisa.

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

Stai cercando di usare empty () per qualcosa a cui non è destinato. Personalmente, penso che il suo comportamento provenga da un vecchio paradigma di programmazione in PHP e potrebbe probabilmente essere ritirato.

Rendi invece i tuoi controlli più espliciti. Invece di verificare se il valore non è utile, verificalo. Ad esempio, se si desidera un array, verificare che sia un array ( is_array () ) anziché verificare se si tratta di una stringa.

Inoltre, puoi fare affidamento sul fatto che tutte le variabili $ _POST e $ _GET sono stringhe, quindi puoi fare confronti con " " oppure verificare che strlen () == 0 .

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

Ho usato la ord per controllare il valore passato era vuoto o no.

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

La soluzione più efficace per questo problema è verificare se la variabile è falsa, ad esempio


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

Non importa se la variabile è vuota o nulla, tutto equivale a falso se messo in un if condizionale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top