Analysieren eines Strings in einen booleschen Wert in PHP

126

Heute habe ich mit PHP gespielt und festgestellt, dass die Zeichenfolgenwerte "true" und "false" in einer Bedingung, beispielsweise unter Berücksichtigung der folgenden Funktion, nicht korrekt auf Boolesche Werte analysiert werden:

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

Wenn ich ausführe:

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

Es scheint nur mit den Werten "1" und "0" zu funktionieren:

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

Gibt es in PHP eine native Funktion, um "wahre" und "falsche" Zeichenfolgen in Boolesche Werte zu analysieren?

Kennzeichen
quelle
Sollte in Ihrem Code isBoolean("")false zurückgeben.
BoltClock
Sie sollten in Betracht ziehen, die akzeptierte Antwort in die Antwort von Eric Caron zu ändern. Es zeigt Ihnen eine native Funktion, die das tut, was Sie verlangen.
Code Commander
1
PHP denkt nicht darüber nach, was ein String sagt. "False" sind nur fünf Zeichen, die nichts bedeuten. Sie sind jedoch etwas , so dass der boolesche Wert ausgewertet wird, trueobwohl es für einen menschlichen Leser intuitiver erscheint, als es bedeutete FALSE.
Zeel

Antworten:

413

Hierfür gibt es eine native PHP-Methode, die die filter_var-Methode von PHP verwendet:

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);

Laut PHP-Handbuch :

Gibt TRUE für "1", "true", "on" und "yes" zurück. Gibt sonst FALSE zurück.

Wenn FILTER_NULL_ON_FAILURE festgelegt ist, wird FALSE nur für "0", "false", "off", "no" und "" zurückgegeben, und NULL wird für alle nicht-booleschen Werte zurückgegeben.

Eric Caron
quelle
Dies sollte die akzeptierte Antwort gewesen sein. Eingebaute PHP-Funktionen sind besser als eigene. Das Rad muss nicht neu erfunden werden! Schade, dass es zu spät war: P
Casraf
1
Kleinschreibt es auch den Wert für den Vergleich in Kleinbuchstaben?
Mobiletainment
3
@Mobiletainment, ja - es behandelt jedes Gehäuse, das Sie sich für $ value vorstellen können (false, FALSE, FalSe usw.)
Eric Caron
Borked Testcase an meinem Ende. Verwendet == anstelle von === zum Vergleich. Entfernt meinen früheren Kommentar, um die Leute nicht zu verwirren.
Andig
5
Die Antwort hat mich überrascht, weil Sie FILTER_NULL_ON_FAILUREder filter_var()Funktion das Flag hinzufügen und es NICHT durch das ersetzen müssen, FILTER_VALIDATE_BOOLEANwie ich dachte. Dies wird zu dem folgenden Code führen, der den Trick für mich $bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
getan
14

Der Grund dafür ist, dass alle Zeichenfolgen truebei der Konvertierung in Boolesche Werte ausgewertet werden , mit Ausnahme von "0"und ""(leere Zeichenfolge).

Die folgende Funktion macht genau das, was Sie wollen: Sie verhält sich genau wie PHP, wertet den String aber auch aus "false"als false:

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

In der Dokumentation wird Folgendes erläutert: http://php.net/manual/en/language.types.boolean.php :

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
  • 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).

Arnaud Le Blanc
quelle
2
+1 Schön. (Könnte einen Strtolower da reinschmeißen, aber das war es auch schon.)
John Parker
Ich denke, Middaparka bedeutete, strtolower ($ value) mit 'false' zu vergleichen. Ein wörtliches 'falsch' in strtolower zu übergeben ist ein wenig ... dumm? :)
Paul Dixon
@ Paul Dixon Yup, darauf habe ich mich bezogen. :-)
John Parker
2
@Marco - if ($ value && strtolower ($ value)! == "faux") {wenn du auf Französisch arbeitest; if ($ value && strtolower ($ value)! == "falsch") {auf deutsch; if ($ value && strtolower ($ value)! == "onwaar") {auf Niederländisch ... Sie können verstehen, warum PHP dies nicht als Standard eingebaut hat
Mark Baker
1
"Alle nicht leeren Zeichenfolgen werden beim Konvertieren in Boolesche Werte als wahr ausgewertet, mit Ausnahme von" 0 "."
BoltClock
5

Nur in PHP "0"oder die leere Zeichenfolge zwingen zu false; Jede andere nicht leere Zeichenfolge wird zu true gezwungen. Aus dem Handbuch :

Bei der Konvertierung in Boolesche Werte werden die folgenden Werte berücksichtigt FALSE:

  • die leere Zeichenfolge und die Zeichenfolge "0"

Sie benötigen eine eigene Funktion zu schreiben , die Saiten zu behandeln "true"vs "false". Hier gehe ich davon aus, dass alles andere standardmäßig false ist:

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

Nebenbei bemerkt, das könnte leicht verdichtet werden

function isBoolean($value) {
   return $value === "true";
}
BoltClock
quelle
4

Ich brauchte kürzlich eine "lose" boolesche Konvertierungsfunktion, um Zeichenfolgen wie die zu behandeln, nach denen Sie fragen (unter anderem). Ich fand ein paar verschiedene Ansätze und fand einen großen Satz von Testdaten, um sie durchzugehen . Da nichts meinen Bedürfnissen entsprach, schrieb ich mein eigenes:

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

Beachten Sie, dass bei Objekten, die sowohl zählbar als auch von Zeichenfolgen umwandelbar sind, die Anzahl gegenüber dem Zeichenfolgenwert bevorzugt wird, um die Wahrhaftigkeit zu bestimmen. Das heißt, wenn $object instanceof Countabledies (boolean) count($object)unabhängig vom Wert von zurückgegeben wird (string) $object.

Sie können das Verhalten für die von mir verwendeten Testdaten sowie die Ergebnisse für mehrere andere Funktionen hier sehen . Es ist schwierig, die Ergebnisse dieses kleinen Iframes zu überfliegen, sodass Sie die Skriptausgabe stattdessen auf einer ganzen Seite anzeigen können (diese URL ist nicht dokumentiert, sodass dies möglicherweise nicht für immer funktioniert). Für den Fall, dass diese Links eines Tages sterben, stelle ich den Code auch auf Pastebin .

Die Grenze zwischen dem, was "wahr sein sollte" und dem, was nicht sein sollte, ist ziemlich willkürlich; Die von mir verwendeten Daten sind nach meinen Bedürfnissen und ästhetischen Vorlieben kategorisiert. Ihre Daten können abweichen.

Matt Kantor
quelle
Diese Funktion funktioniert einwandfrei, danke! Aber Ihre Links sind jetzt 404.
Servermanfail
3

Ich verwende dieses Konstrukt, um Zeichenfolgen in Boolesche trueWerte umzuwandeln, da Sie für die meisten anderen Werte Folgendes wünschen :

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

Gibt es in PHP eine Funktion, um "wahre" und "falsche" Zeichenfolgen in Boolesche Werte zu analysieren?

Nein - beide sind Zeichenfolgen, und beide bewerten (wie Sie sagen) true. falseIn PHP werden nur leere Zeichenfolgen ausgewertet .

Sie müssten dies manuell testen. Wenn es überhaupt möglich ist, ist es besser, stattdessen mit "echten" booleschen Werten zu arbeiten.

Pekka
quelle
1
Nicht alle Zeichenfolgen werden truein PHP ausgewertet .
Coreyward
1
Nicht korrigiert, nur geklärt. Die Aussage "beide sind Zeichenfolgen [und wird ausgewertet true]" kann einem Neuling den falschen Eindruck vermitteln, insbesondere einer aus einer anderen Sprache mit strengeren Tippregeln, bei der eine Zeichenfolge eine Zeichenfolge ist und der Inhalt keine Rolle spielt, wenn er in einen Booleschen Wert konvertiert wird (z Rubin).
Coreyward
1
"Nur leere Zeichenfolgen werden in PHP als falsch ausgewertet." Aber was ist mit der nicht leeren Zeichenfolge "0"? Wird das nicht auch ausgewertet false?
September
0

Einfachste Möglichkeit, sicher in einen Booleschen Wert zu konvertieren;

    $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'
Timothy Perez
quelle
0

Wenn Ihre API nur die Zeichenfolgen "true" oder "false" akzeptiert und alles andere wirdnull , versuchen Sie Folgendes:

$boolean = ['true' => true, 'false' => false][$inputString] ?? null;

Dies setzt voraus, dass dies $inputkein Objekt ist. Null coalesce ( ??) wurde in PHP 7.0 eingeführt.

Matt Janssen
quelle