So konvertieren Sie Zeichenfolgen in boolesche PHP


317

Wie kann ich einen String konvertieren boolean?

$string = 'false';

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

var_dump($test_mode_mail);

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

es kehrt zurück,

Boolescher Wert wahr

aber es sollte sein boolean false.


Warum hat jemand über $ bool = !! $ string1 geantwortet?
Zloctb

1
@zloctb, weil es die Frage nicht beantwortet. !!$string1würde einen Booleschen Wert zurückgeben, der die in der am besten bewerteten Antwort angegebene Zeichenfolge angibt.
David Barker

Antworten:


345

Strings werden immer als boolean true ausgewertet, es sei denn, sie haben einen Wert, der von PHP als "leer" betrachtet wird (entnommen aus der Dokumentation fürempty ):

  1. "" (eine leere Zeichenfolge);
  2. "0" (0 als Zeichenfolge)

Wenn Sie einen Booleschen Wert basierend auf dem Textwert einer Zeichenfolge festlegen müssen, müssen Sie prüfen, ob dieser Wert vorhanden ist oder nicht.

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

BEARBEITEN: Der obige Code dient der Klarheit des Verständnisses. Bei der tatsächlichen Verwendung ist der folgende Code möglicherweise besser geeignet:

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

oder vielleicht kann die Verwendung der filter_varFunktion mehr boolesche Werte abdecken:

filter_var($string, FILTER_VALIDATE_BOOLEAN);

filter_varumfasst eine ganze Reihe von Werten, einschließlich der truthy Werte "true", "1", "yes"und "on". Sehen Sie hier für weitere Details.


4
Ich empfehle immer einen strengen Vergleich, wenn Sie nicht sicher sind, was Sie tun:$string === 'true'
Znarkus

247
Ich habe das gefunden - filter_var($string, FILTER_VALIDATE_BOOLEAN);ist es eine gute Sache?
Laukok

10
Das Ternäre scheint nicht notwendig zu sein. Warum nicht einfach $ test_mode_mail auf den Wert der Ungleichung setzen? $ test_mode_mail = $ string === 'true'
Tim Banks

3
Aber was ist mit 1/0, WAHR / FALSCH? Ich denke, die Antwort von @lauthiamkok ist die beste.
Ryabenko-Pro

1
@FelipeTadeo Ich spreche darüber, wie PHP Zeichenfolgen in Bezug auf boolesche Operationen bewertet. Ich habe eval () nie erwähnt und würde unter keinen Umständen empfehlen, es zu verwenden. Die Zeichenfolge "(3 <5)" wird von PHP als boolean true ausgewertet, da sie nicht leer ist.
GordonM

645

Diese Methode wurde von @lauthiamkok in den Kommentaren gepostet. Ich poste es hier als Antwort, um mehr Aufmerksamkeit darauf zu lenken.

Abhängig von Ihren Anforderungen sollten Sie die Verwendung filter_var()mit der FILTER_VALIDATE_BOOLEANFlagge in Betracht ziehen .

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
Diese Funktion steht laut Dokumentation für PHP 5> = 5.2.0 zur Verfügung. php.net/manual/en/function.filter-var.php
Westy92

4
Diese Lösung zum Festlegen von Booleschen Werten basierend auf WordPress-Shortcode-Attributen mit Werten wie true, false, on, 0 usw. gefällt mir sehr gut. Eine gute Antwort sollte auf jeden Fall die akzeptierte Antwort sein.
AndyWarren

11
filter_var($answer, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)hat noch besser für mich gearbeitet. Siehe php.net/manual/en/function.filter-var.php#121263
Ryan

!! Wichtige Notiz !! filter_var gibt auch FALSE zurück, wenn der Filter ausfällt. Dies kann zu Problemen führen.
AFA Med

35

Der String "false" wird "TRUE"von PHP tatsächlich als Wert betrachtet. Die Dokumentation sagt:

Verwenden Sie die Umwandlungen (bool) oder (boolean), um einen Wert explizit in einen Booleschen Wert umzuwandeln. In den meisten Fällen ist die Umwandlung jedoch nicht erforderlich, da ein Wert automatisch konvertiert wird, wenn ein Operator, eine Funktion oder eine Steuerungsstruktur ein boolesches Argument erfordert.

Siehe auch Typ Jonglieren.

Bei der Konvertierung in einen Booleschen Wert werden die folgenden Werte als FALSE betrachtet:

  • der boolesche FALSE selbst

  • die ganze Zahl 0 (Null)

  • der float 0.0 (null)

  • die leere Zeichenfolge und die Zeichenfolge "0"

  • ein Array mit null Elementen

  • ein Objekt mit null Mitgliedsvariablen (nur PHP 4)

  • der spezielle Typ NULL (einschließlich nicht festgelegter Variablen)

  • SimpleXML-Objekte, die aus leeren Tags erstellt wurden

Jeder andere Wert wird als WAHR betrachtet (einschließlich aller Ressourcen).

Wenn Sie dies tun:

$bool = (boolean)"False";

oder

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

in beiden Fällen $boolwird sein TRUE. Sie müssen es also manuell tun, wie GordonM vorschlägt.


1
Euhm, natürlich gibt der untere falsch zurück. Tatsächlich wird ein schwerwiegender Fehler ausgelöst :) "Schwerwiegender Fehler: Nur Variablen können als Referenz übergeben werden". $ a = 'Falsch'; Settype ($ a, 'boolean'); var_dump ($ a); wird in der Tat falsch zurückgeben.
Rob

16

Bei der Arbeit mit JSON musste ich einen Booleschen Wert über senden $_POST. Ich hatte ein ähnliches Problem, als ich so etwas tat wie:

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

Im obigen Code wurde mein Boolescher Wert in eine JSON-Zeichenfolge konvertiert.

Um dies zu überwinden, können Sie die Zeichenfolge folgendermaßen dekodieren json_decode():

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

(Dies sollte normalerweise mit Booleschen Werten funktionieren, die in Zeichenfolgen konvertiert und auch auf andere Weise an den Server gesendet werden, dh nicht mithilfe von JSON.)


11

Sie können json_decode verwenden, um diesen Booleschen Wert zu dekodieren

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

json_decode wird auch in eine Ganzzahl umgewandelt, wenn die angegebene Zeichenfolge eine Ganzzahl ist
Mihai Răducanu

1
Ja, das stimmt, aber es wird erwähnt, dass die Zeichenfolge einen booleschen Wert enthält
Souparno Majumder

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

Es behandelt alle möglichen Varianten von $string

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

Was ist mit onund off?
Cyclonecode

7

Wenn Ihre "boolesche" Variable aus einem globalen Array wie $ _POST und $ _GET stammt, können Sie die filter_input()Filterfunktion verwenden.

Beispiel für POST:

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

Wenn Ihre "boolesche" Variable aus einer anderen Quelle stammt, können Sie die filter_var()Filterfunktion verwenden.

Beispiel:

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

7

Sie können verwenden boolval($strValue)

Beispiele:

<?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";
?>

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


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

Sie können echo (int)'false;oderecho intval('false');
anayarojo

@anayarojo (int)'true'und intval('true')beide geben auch 0 zurück (alle Zeichenfolgen tun es)
skizzenhaftTech

4

Am einfachsten ist dies:

$str = 'TRUE';

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

var_dump($boolean);

Auf diese Weise können Sie eine Reihe von 'true', 'TRUE', 'false' oder 'FALSE' durchlaufen und den String-Wert auf einen Booleschen Wert bringen.


3

Andere Antworten sind überkompliziert. Diese Frage ist einfach eine logische Frage. Machen Sie einfach Ihre Aussage richtig.

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

Jetzt wird Ihre Antwort entweder sein

  • false, wenn die Zeichenfolge war 'false',
  • oder true, wenn Ihre Zeichenfolge war 'true'.

Ich muss beachten, dass dies filter_var( $boolString, FILTER_VALIDATE_BOOLEAN );immer noch eine bessere Option ist, wenn Sie Zeichenfolgen wie on/yes/1als Alias ​​für benötigen true.


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

oder

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

Sie müssen angeben

FILTER_NULL_ON_FAILURE
Andernfalls werden Sie immer falsch, auch wenn $ string etwas anderes enthält.


2

Sie können auch die Settype-Methode verwenden!

SetType ($ var, "Boolean") Echo $ var // siehe 0 oder 1


2

Ich mache es auf eine Weise, die in jedem Fall die unempfindliche Version des Strings "false" in den booleschen Wert FALSE umwandelt, sich aber unter Verwendung der normalen PHP-Casting-Regeln für alle anderen Strings verhält. Ich denke, dies ist der beste Weg, um unerwartetes Verhalten zu verhindern.

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

Oder als Funktion:

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

2

Die Antwort von @GordonM ist gut. Aber es würde fehlschlagen, wenn das $stringbereits ist true(dh die Zeichenfolge ist keine Zeichenfolge, sondern boolesche WAHR) ... was unlogisch erscheint.

Um seine Antwort zu erweitern, würde ich verwenden:

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

0

Ich war verwirrt mit WordPress-Shortcode-Attributen und entschied mich, eine benutzerdefinierte Funktion zu schreiben, um alle Möglichkeiten zu nutzen. Vielleicht ist es für jemanden nützlich:

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
Ich suchte zunächst nach Hilfe, fand aber nichts so einfach, wie ich es mir erhofft hatte. Deshalb habe ich meine eigene Funktion geschrieben. Fühlen Sie sich frei, es zu benutzen.
Tomi

-1

Eine einfache Möglichkeit besteht darin, anhand eines Arrays von Werten zu prüfen, die Sie für wahr halten.

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

-1

Bearbeitet, um eine hier nicht erwähnte Möglichkeit aufzuzeigen, da meine ursprüngliche Antwort weit davon entfernt war, mit der Frage des OP in Zusammenhang zu stehen.

preg_match (); Ist möglich zu benutzen. In den meisten Anwendungen ist die Verwendung jedoch viel schwerer als bei anderen Antworten.

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)/iKann bei Bedarf auch in bestimmten Situationen verwendet werden. Es wird nicht korrekt zurückgegeben, wenn eine Zeichenfolge ausgewertet wird, die sowohl "false" als auch "1" enthält.


Dies wurde nicht gefragt. Die Frage ist, wie man einen String in einen Booleschen Wert konvertiert.
Herr

mrded: Ich habe die Frage, die ich entschuldige, falsch verstanden. Im Geiste guter Form werde ich eine weitere Möglichkeit hinzufügen, die hier nicht erwähnt wird.
JSG

-1

In PHP können Sie einfach einen Wert in einen Booleschen Wert konvertieren, indem Sie den Operator double not ( !!) verwenden:

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

Sie sollten in der Lage sein, mit (bool) in einen Booleschen Wert umzuwandeln, aber ich bin mir nicht sicher, ohne zu überprüfen, ob dies für die Zeichenfolgen "true" und "false" funktioniert.

Dies könnte jedoch einen Pop wert sein

$myBool = (bool)"False"; 

if ($myBool) {
    //do something
}

Es ist wichtig zu wissen, dass das Folgende den Booleschen Wert False ergibt, wenn es hineingelegt wird

if()
  • der boolesche FALSE selbst
  • die ganze Zahl 0 (Null)
  • der float 0.0 (null)
  • die leere Zeichenfolge und die Zeichenfolge "0"
  • ein Array mit null Elementen
  • ein Objekt mit null Mitgliedsvariablen (nur PHP 4)
  • der spezielle Typ NULL (einschließlich nicht festgelegter Variablen)
  • SimpleXML-Objekte, die aus leeren Tags erstellt wurden

Alles andere wird als wahr bewertet.

Wie hier beschrieben: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting


6
Als Antwort auf die Vermutung in Ihrem ersten Absatz: Die Verwendung einer expliziten Umwandlung "false"in einen Booleschen Wert wird in konvertiert true.
Mark Amery

2
Dies wird "wahr" drucken$myBool = (bool)"False"; if ($myBool) { echo "true"; }
SSH Diesen

2
Dies ist falsch. Zeichenfolgen werden als wahr ausgewertet, sofern sie nicht "" oder "0" enthalten.
Michael J. Calkins
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.