私は最近、(特に)質問しているような文字列を処理するための「ルーズ」なブール変換関数が必要でした。 私はいくつかの異なるアプローチを見つけ、それらを実行するための大量のテストデータを思い付きました。私のニーズに完全に合うものは何もないので、私は自分で書きました:
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;
}
}
カウント可能で文字列キャスト可能であるオブジェクトの場合、これは文字列値よりもカウントを優先して真実性を判断します。つまり、$object instanceof Countable
これが次(boolean) count($object)
の値に関係なく戻る場合(string) $object
。
ここで、使用したテストデータの動作と他のいくつかの関数の結果を確認できます。その小さなiframeからの結果をざっと見るのはちょっと難しいので、代わりにスクリプトの出力を全ページで表示できます(そのURLは文書化されていないため、これは永久に機能しない可能性があります)。それらのリンクがいつか死ぬ場合に備えて、私はペーストビンにもコードを載せました。
「真実であるべき」とそうでないことの境界はかなり恣意的です。私が使用したデータは、私のニーズと美的好みに基づいて分類されています。
isBoolean("")
は、falseを返す必要があります。