Come convertire string in php booleano


318

Come posso convertire la stringa in boolean?

$string = 'false';

$test_mode_mail = settype($string, 'boolean');

var_dump($test_mode_mail);

if($test_mode_mail) echo 'test mode is on.';

ritorna,

booleano vero

ma dovrebbe essere boolean false.


Perché qualcuno ha risposto su $ bool = !! $ string1?
zloctb,

1
@zloctb perché non risponde alla domanda. !!$string1restituirebbe un indice booleano della stringa indicata nella risposta più votata.
David Barker,

Risposte:


347

Le stringhe valutano sempre come vero booleano a meno che non abbiano un valore considerato "vuoto" da PHP (preso dalla documentazione perempty ):

  1. "" (una stringa vuota);
  2. "0" (0 come stringa)

Se devi impostare un valore booleano in base al valore del testo di una stringa, dovrai verificare la presenza o meno di quel valore.

$test_mode_mail = $string === 'true'? true: false;

EDIT: il codice sopra è inteso per chiarezza di comprensione. Nell'uso effettivo il seguente codice può essere più appropriato:

$test_mode_mail = ($string === 'true');

o forse l'uso della filter_varfunzione può coprire più valori booleani:

filter_var($string, FILTER_VALIDATE_BOOLEAN);

filter_varcopre tutta una serie di valori, inclusi i valori truthy "true", "1", "yes"e "on". Vedi qui per maggiori dettagli.


5
Consiglio di usare sempre un confronto rigoroso, se non sei sicuro di cosa stai facendo:$string === 'true'
Znarkus,

248
Ho trovato questo - filter_var($string, FILTER_VALIDATE_BOOLEAN);è una buona cosa?
Laukok,

10
Il ternario non sembra necessario. Perché non impostare $ test_mode_mail sul valore della disuguaglianza? $ test_mode_mail = $ string === 'true'
Tim Banks

3
Ma che dire di 1/0, VERO / FALSO? Penso che la risposta di @lauthiamkok sia la migliore.
Ryabenko-pro,

1
@FelipeTadeo Sto parlando di come PHP valuta le stringhe rispetto alle operazioni booleane, non ho mai menzionato eval () e non consiglierei mai di usarlo in nessuna circostanza. La stringa "(3 <5)" verrà valutata da PHP come vera booleana perché non è vuota.
GordonM,

648

Questo metodo è stato pubblicato da @lauthiamkok nei commenti. Lo sto postando qui come risposta per richiamare più attenzione su di esso.

A seconda delle tue esigenze, dovresti considerare l'utilizzo filter_var()con la FILTER_VALIDATE_BOOLEANbandiera.

filter_var(    true, FILTER_VALIDATE_BOOLEAN); // true
filter_var(    'true', FILTER_VALIDATE_BOOLEAN); // true
filter_var(         1, FILTER_VALIDATE_BOOLEAN); // true
filter_var(       '1', FILTER_VALIDATE_BOOLEAN); // true
filter_var(      'on', FILTER_VALIDATE_BOOLEAN); // true
filter_var(     'yes', FILTER_VALIDATE_BOOLEAN); // true

filter_var(   false, FILTER_VALIDATE_BOOLEAN); // false
filter_var(   'false', FILTER_VALIDATE_BOOLEAN); // false
filter_var(         0, FILTER_VALIDATE_BOOLEAN); // false
filter_var(       '0', FILTER_VALIDATE_BOOLEAN); // false
filter_var(     'off', FILTER_VALIDATE_BOOLEAN); // false
filter_var(      'no', FILTER_VALIDATE_BOOLEAN); // false
filter_var('asdfasdf', FILTER_VALIDATE_BOOLEAN); // false
filter_var(        '', FILTER_VALIDATE_BOOLEAN); // false
filter_var(      null, FILTER_VALIDATE_BOOLEAN); // false

5
Secondo la documentazione, questa funzione è disponibile per PHP 5> = 5.2.0. php.net/manual/en/function.filter-var.php
Westy92

4
Mi piace molto questa soluzione per impostare valori booleani basati sugli attributi dello shortcode di WordPress che hanno valori come true, false, on, 0, ecc. Ottima risposta, dovrebbe sicuramente essere la risposta accettata.
AndyWarren,

11
filter_var($answer, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)ha funzionato ancora meglio per me. Vedi php.net/manual/en/function.filter-var.php#121263
Ryan

!! Nota importante !! filter_var restituisce anche FALSE se il filtro non riesce. Ciò può creare alcuni problemi.
AFA Med

35

La stringa "false" è in realtà considerata un "TRUE"valore da PHP. La documentazione dice:

Per convertire esplicitamente un valore in booleano, usa i cast (boolean) o (boolean). Tuttavia, nella maggior parte dei casi il cast non è necessario, poiché un valore verrà automaticamente convertito se un operatore, una funzione o una struttura di controllo richiedono un argomento booleano.

Vedi anche Tipo di giocoleria.

Quando si converte in booleano, i seguenti valori sono considerati FALSI:

  • lo stesso FALSO booleano

  • il numero intero 0 (zero)

  • il galleggiante 0.0 (zero)

  • la stringa vuota e la stringa "0"

  • un array con zero elementi

  • un oggetto con zero variabili membro (solo PHP 4)

  • il tipo speciale NULL (comprese le variabili non impostate)

  • Oggetti SimpleXML creati da tag vuoti

Ogni altro valore è considerato VERO (compresa qualsiasi risorsa).

quindi se lo fai:

$bool = (boolean)"False";

o

$test = "false";
$bool = settype($test, 'boolean');

in entrambi i casi $boolsarà TRUE. Quindi devi farlo manualmente, come suggerisce GordonM.


1
Euhm, ovviamente quello inferiore ritorna falso. In effetti, genera un errore irreversibile :) "Errore irreversibile: solo le variabili possono essere passate per riferimento". $ a = 'Falso'; settype ($ a, 'booleana'); var_dump ($ a); tornerà davvero falso.
Rob,

16

Quando ho lavorato con JSON, ho dovuto inviare un valore booleano tramite $_POST. Ho avuto un problema simile quando ho fatto qualcosa di simile:

if ( $_POST['myVar'] == true) {
    // do stuff;
}

Nel codice sopra, il mio booleano è stato convertito in una stringa JSON.

Per ovviare a questo, puoi decodificare la stringa usando json_decode():

//assume that : $_POST['myVar'] = 'true';
 if( json_decode('true') == true ) { //do your stuff; }

(Ciò dovrebbe funzionare normalmente con valori booleani convertiti in stringa e inviati al server anche con altri mezzi, ad esempio diversi dall'uso di JSON.)


11

puoi usare json_decode per decodificare quel booleano

$string = 'false';
$boolean = json_decode($string);
if($boolean) {
  // Do something
} else {
  //Do something else
}

json_decode si trasformerà anche in intero se la stringa specificata è un numero intero
Mihai Răducanu

1
Sì, è vero, ma si dice che la stringa ha un valore booleano
souparno majumder

8
(boolean)json_decode(strtolower($string))

Gestisce tutte le possibili varianti di $string

'true'  => true
'True'  => true
'1'     => true
'false' => false
'False' => false
'0'     => false
'foo'   => false
''      => false

Che dire di one off?
ciclico

7

Se la variabile "booleana" proviene da un array globale come $ _POST e $ _GET, è possibile utilizzare la filter_input()funzione filtro.

Esempio per POST:

$isSleeping  = filter_input(INPUT_POST, 'is_sleeping',  FILTER_VALIDATE_BOOLEAN);

Se la tua variabile "booleana" proviene da un'altra fonte puoi usare la filter_var()funzione filtro.

Esempio:

filter_var('true', FILTER_VALIDATE_BOOLEAN); // true

7

Puoi usare boolval($strValue)

Esempi:

<?php
echo '0:        '.(boolval(0) ? 'true' : 'false')."\n";
echo '42:       '.(boolval(42) ? 'true' : 'false')."\n";
echo '0.0:      '.(boolval(0.0) ? 'true' : 'false')."\n";
echo '4.2:      '.(boolval(4.2) ? 'true' : 'false')."\n";
echo '"":       '.(boolval("") ? 'true' : 'false')."\n";
echo '"string": '.(boolval("string") ? 'true' : 'false')."\n";
echo '"0":      '.(boolval("0") ? 'true' : 'false')."\n";
echo '"1":      '.(boolval("1") ? 'true' : 'false')."\n";
echo '[1, 2]:   '.(boolval([1, 2]) ? 'true' : 'false')."\n";
echo '[]:       '.(boolval([]) ? 'true' : 'false')."\n";
echo 'stdClass: '.(boolval(new stdClass) ? 'true' : 'false')."\n";
?>

Documentazione http://php.net/manual/es/function.boolval.php


2
echo boolval('false');=> 1
Mubashar,

Puoi usare echo (int)'false;oecho intval('false');
anayarojo il

@anayarojo (int)'true'ed intval('true')entrambi restituiscono anche 0 (fanno tutte le stringhe)
sketchyTech

4

la cosa più semplice da fare è questa:

$str = 'TRUE';

$boolean = strtolower($str) == 'true' ? true : false;

var_dump($boolean);

In questo modo, è possibile scorrere una serie di "true", "TRUE", "false" o "FALSE" e ottenere il valore della stringa in un valore booleano.


3

Altre risposte sono complicate. Questa domanda è semplicemente una domanda logica . Prendi la tua affermazione giusta.

$boolString = 'false';
$result = 'true' === $boolString;

Ora la tua risposta sarà entrambe

  • false, se la stringa fosse 'false',
  • oppure true, se la tua stringa era 'true'.

Devo notare che filter_var( $boolString, FILTER_VALIDATE_BOOLEAN );sarà comunque un'opzione migliore se hai bisogno di stringhe come on/yes/1alias per true.


3
function stringToBool($string){
    return ( mb_strtoupper( trim( $string)) === mb_strtoupper ("true")) ? TRUE : FALSE;
}

o

function stringToBool($string) {
    return filter_var($string, FILTER_VALIDATE_BOOLEAN);
}

3
filter_var($string, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);

$string = 1; // true
$string ='1'; // true
$string = 'true'; // true
$string = 'trUe'; // true
$string = 'TRUE'; // true
$string = 0; // false
$string = '0'; // false
$string = 'false'; // false
$string = 'False'; // false
$string = 'FALSE'; // false
$string = 'sgffgfdg'; // null

Devi specificare

FILTER_NULL_ON_FAILURE
altrimenti diventerai sempre falso anche se $ string contiene qualcos'altro.


2

Puoi anche usare il metodo settype!

SetType ($ var, "Boolean") Eco $ var // vedi 0 o 1


2

Lo faccio in un modo che lancerà qualsiasi versione insensibile alle maiuscole della stringa "false" al booleano FALSE, ma si comporterà usando le normali regole di casting php per tutte le altre stringhe. Penso che questo sia il modo migliore per prevenire comportamenti imprevisti.

$test_var = 'False';
$test_var = strtolower(trim($test_var)) == 'false' ? FALSE : $test_var;
$result = (boolean) $test_var;

O come una funzione:

function safeBool($test_var){
    $test_var = strtolower(trim($test_var)) == 'false' ? FALSE : $test_var;
    return (boolean) $test_var;
}

2

La risposta di @GordonM è buona. Ma fallirebbe se $stringè già true(cioè, la stringa non è una stringa ma VERA booleana) ... il che sembra illogico.

Estendendo la sua risposta, userei:

$test_mode_mail = ($string === 'true' OR $string === true));

0

Mi stavo confondendo con gli attributi dello shortcode di wordpress, ho deciso di scrivere una funzione personalizzata per gestire tutte le possibilità. forse è utile per qualcuno:

function stringToBool($str){
    if($str === 'true' || $str === 'TRUE' || $str === 'True' || $str === 'on' || $str === 'On' || $str === 'ON'){
        $str = true;
    }else{
        $str = false;
    }
    return $str;
}
stringToBool($atts['onOrNot']);

1
stavo cercando aiuto in primo luogo, ma non ho trovato niente di facile come speravo. ecco perché ho scritto la mia funzione. sentiti libero di usarlo.
tomi,

-1

Un modo semplice è verificare con una matrice di valori considerati veri.

$wannabebool = "false";
$isTrue = ["true",1,"yes","ok","wahr"];
$bool = in_array(strtolower($wannabebool),$isTrue);

-1

Modificato per mostrare una possibilità non menzionata qui, perché la mia risposta originale era tutt'altro che correlata alla domanda del PO.

preg_match (); È possibile usare. Tuttavia, nella maggior parte delle applicazioni sarà molto più pesante da usare rispetto ad altre risposte qui.

if (preg_match("/true/i", "true PHP is a web scripting language of choice.")) {
    echo "<br><br>Returned true";
} else {
    echo "<br><br>Returned False";
}

/(?:true)|(?:1)/iPuò essere utilizzato anche se necessario in determinate situazioni. Non restituirà correttamente quando valuta una stringa contenente sia "false" che "1".


Questo non è ciò che è stato chiesto. La domanda è come convertire una stringa in booleano.
Il

mrded: ho letto male la domanda che mi scuso. Quindi, nella buona forma dello spirito, aggiungerò un'altra possibilità non menzionata qui.
JSG

-1

In PHP puoi semplicemente convertire un valore in un valore booleano usando double not operator ( !!):

var_dump(!! true);     // true
var_dump(!! "Hello");  // true
var_dump(!! 1);        // true
var_dump(!! [1, 2]);   // true
var_dump(!! false);    // false
var_dump(!! null);     // false
var_dump(!! []);       // false
var_dump(!! 0);        // false
var_dump(!! '');       // false

-4

Dovresti essere in grado di eseguire il cast su un booleano usando (bool) ma non sono sicuro senza verificare se questo funziona sulle stringhe "true" e "false".

Questo potrebbe valere la pena di essere pop

$myBool = (bool)"False"; 

if ($myBool) {
    //do something
}

Vale la pena sapere che quanto segue valuterà il falso booleano una volta inserito

if()
  • lo stesso FALSO booleano
  • il numero intero 0 (zero)
  • il galleggiante 0.0 (zero)
  • la stringa vuota e la stringa "0"
  • un array con zero elementi
  • un oggetto con zero variabili membro (solo PHP 4)
  • il tipo speciale NULL (comprese le variabili non impostate)
  • Oggetti SimpleXML creati da tag vuoti

Tutto il resto valuterà come vero.

Come descritto qui: http://www.php.net/manual/it/language.types.boolean.php#language.types.boolean.casting


6
In risposta all'ipotesi del tuo primo paragrafo: l'uso di un cast esplicito in booleano si convertirà "false"in true.
Mark Amery,

2
Questo stamperà "vero"$myBool = (bool)"False"; if ($myBool) { echo "true"; }
SSH Questo

2
Questo è sbagliato, le stringhe vengono valutate come vere a meno che non contengano "" o "0".
Michael J. Calkins,
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.