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 Countable
dies (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.
isBoolean("")
false zurückgeben.