2011-01-23 17 views
89

Oggi stavo giocando con PHP e ho scoperto che i valori stringa "true" e "false" non sono stati correttamente analizzati in booleane in una condizione, ad esempio considerando la seguente funzione:Analizzare una stringa in un valore booleano in PHP

function isBoolean($value) { 
    if ($value) { 
     return true; 
    } else { 
     return false; 
    } 
} 

Se eseguo:

isBoolean("true") // Returns true 
isBoolean("") // Returns false 
isBoolean("false") // Returns true, instead of false 
isBoolean("asd") // Returns true, instead of false 

mi sembra di lavorare con "1" e "0" valori:

isBoolean("1") // Returns true 
isBoolean("0") // Returns false 

Esiste una funzione nativa in PHP per analizzare le stringhe "true" e "false" in booleano?

+0

Nel codice, 'isBoolean (" ")' deve restituire false. – BoltClock

+0

@BoltClock aggiornato, con – Mark

+0

È consigliabile modificare la risposta accettata alla risposta di Eric Caron. Ti mostra una funzione nativa che fa ciò che chiedi. –

risposta

306

C'è un metodo PHP nativo di fare questo, che utilizza il metodo filter_var di PHP:

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN); 

secondo il manuale di PHP:

Restituisce vero per "1", "vero", "on" e "y es". Restituisce FALSO in caso contrario.

Se FILTER_NULL_ON_FAILURE è impostato, FALSE viene restituito solo per "0", "false", "off", "no" e "" e NULL viene restituito per tutti i valori non booleani.

+0

Questa dovrebbe essere la risposta accettata. Le funzioni PHP integrate sono migliori di quelle personali. Non c'è bisogno di reinventare la ruota! Peccato che fosse troppo tardi: P – casraf

+0

lo fa anche in minuscolo il valore per il confronto? – Mobiletainment

+2

@Mobiletainment, sì - gestisce qualsiasi tipo di custodia che si possa immaginare per $ value (false, FALSE, FalSe, ecc.) –

12

Il motivo è che tutte le stringhe vengono valutate su true durante la conversione in booleano, ad eccezione di "0" e "" (stringa vuota).

La seguente funzione farà esattamente quello che vuoi: si comporta esattamente come PHP, ma sarà anche valuta la stringa "false" come false:

function isBoolean($value) { 
    if ($value && strtolower($value) !== "false") { 
     return true; 
    } else { 
     return false; 
    } 
} 

La documentazione spiega che: http://php.net/manual/en/language.types.boolean.php:

Durante la conversione in booleana, i seguenti valori sono considerati FALSE:

  • FALSE booleano stessa
  • il numero intero 0 (zero)
  • il galleggiante 0,0 (zero)
  • la stringa vuota, e la stringa "0"
  • un array con zero elementi
  • la tipo NULL speciale (incluse variabili non impostate)
  • oggetti SimpleXML creato dal tag vuoti

Ogni altro valore è considerato Vero (inclusa qualsiasi risorsa).

+1

+1 Nizza. (Potresti fare un passo indietro, ma è tutto a posto.) –

+0

Penso che middaparka significasse il confronto tra strtolower ($ value) con 'false'. Passare un "falso" letterale in strtolower è un po '.... daft? :) –

+0

@Paul Dixon Yup, questo è quello a cui mi riferivo. :-) –

4

In PHP solo "0" o stringa vuota coercitiva su falso; ogni altra stringa non vuota costringe a true. Dal manual:

Durante la conversione in boolean, i seguenti valori sono considerati FALSE:

  • la stringa vuota, e la stringa "0"

è necessario scrivere la tua funzione per gestire le stringhe "true" vs "false".Qui, suppongo che tutto il resto il default è falso:

function isBoolean($value) { 
    if ($value === "true") { 
     return true; 
    } else { 
     return false; 
    } 
} 

Su un lato nota che potrebbe facilmente essere condensato al

function isBoolean($value) { 
    return $value === "true"; 
} 
1

C'è una funzione in PHP per analizzare "vero" e "falso "stringe in booleano?

No - entrambe sono stringhe, e quelle entrambe (come dici tu) valutano a true. Solo stringhe vuote valutano in false in PHP.

È necessario verificarlo manualmente. Se possibile, tuttavia, sarebbe meglio lavorare con valori booleani "reali".

+1

Non tutte le stringhe valutano 'true' in PHP. – coreyward

+1

Non stava correggendo, solo chiarificando. Dire "entrambe sono stringhe [e valutare con' true'] "potrebbe dare a un newbie un'impressione sbagliata, specialmente una da un'altra lingua con regole di tipizzazione più rigide in cui una stringa è una stringa e il contenuto non ha importanza quando viene convertito in booleano (come Ruby). – coreyward

+1

@ abbastanza giusto, buon punto. Chiarirò nel testo –

3

Sto usando questo costrutto di trasformarsi stringhe in booleani, dal momento che si desidera true per la maggior parte degli altri valori:

$str = "true"; 
$bool = !in_array($str, array("false", "", "0", "no", "off")); 
2

Recentemente ho avuto bisogno di una funzione di conversione booleana "libera" per gestire stringhe come quelle che stai chiedendo (tra le altre cose). I found a few different approaches and came up with a big set of test data to run through them. Niente abbastanza adatta alle mie esigenze così ho scritto il mio:

function loosely_cast_to_boolean($value) { 
    if(is_array($value) || $value instanceof Countable) { 
     return (boolean) count($value); 
    } else if(is_string($value) || is_object($value) && method_exists($value, '__toString')) { 
     $value = (string) $value; 
     // see http://www.php.net/manual/en/filter.filters.validate.php#108218 
     // see https://bugs.php.net/bug.php?id=49510 
     $filtered = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); 
     if(!is_null($filtered)) { 
      return $filtered; 
     } else { 
      // "none" gets special treatment to be consistent with ini file behavior. 
      // see documentation in php.ini for more information, in part it says: 
      // "An empty string can be denoted by simply not writing anything after 
      // the equal sign, or by using the None keyword". 
      if(strtolower($value) === 'none') { 
       $value = ''; 
      } 
      return (boolean) $value; 
     } 
    } else { 
     return (boolean) $value; 
    } 
} 

Si noti che per gli oggetti che sono sia numerabile e la stringa-colabile, questo favorirà il conteggio oltre il valore di stringa per determinare truthiness. Cioè, se $object instanceof Countable questo restituirà (boolean) count($object) indipendentemente dal valore di (string) $object.

È possibile visualizzare il comportamento per i dati di test utilizzati nonché i risultati per diverse altre funzioni here. È piuttosto difficile scremare i risultati di quel piccolo iframe, quindi puoi usare lo view the script output in a full page (l'URL non è documentato, quindi potrebbe non funzionare per sempre). Nel caso in cui quei collegamenti muoiono un giorno, I put the code up on pastebin pure.

Il confine tra ciò che "dovrebbe essere vero" e ciò che non dovrebbe essere abbastanza arbitrario; i dati che ho usato sono categorizzati in base alle mie esigenze e preferenze estetiche, il tuo può differire.

0

Il modo più semplice per convertire in modo sicuro in un booleano;

$flag = 'true'; 

    if(filter_var($flag,FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) !== null) { 
     $flag = filter_var($flag,FILTER_VALIDATE_BOOLEAN); 
    } 

    gettype($flag); // Would Return 'Boolean' 
    echo 'Val: '.$flag; // Would Output 'Val: 1' 
Problemi correlati