Нещодавно мені потрібна була "вільна" булева функція перетворення для обробки рядків, таких як ті, про які ви запитуєте (серед іншого). Я знайшов кілька різних підходів і придумав великий набір тестових даних для пробігу через них . Нічого не відповідає моїм потребам, тому я написав своє:
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
.
Тут ви можете побачити поведінку тестових даних, які я використав, а також результати для кількох інших функцій тут . Результати з цього маленького рамки кадрів важко схилити, тож ви можете замість цього переглядати вихід сценарію на повній сторінці (ця URL-адреса недокументована, тому це може не працювати назавжди). Якщо ці посилання в один прекрасний день помирають, я кладу код на пастбін .
Межа між тим, що "повинно бути правдою" і тим, що не повинно, є досить довільним; дані, які я використовував, класифікуються на основі моїх потреб та естетичних уподобань, ваші можуть відрізнятися.
isBoolean("")
повинно бути повернено помилкове.