Son zamanlarda sorduğunuz gibi dizeleri (diğer şeylerin yanı sıra) işlemek için "gevşek" bir boole dönüştürme işlevine ihtiyacım vardı. Birkaç farklı yaklaşım buldum ve bunların üzerinden geçmek için büyük bir test verileri seti buldum . Hiçbir şey ihtiyaçlarıma tam olarak uymuyor, bu yüzden kendim yazdım:
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;
}
}
Hem sayılabilir hem de dizge ile dönüştürülebilir nesneler için bu, doğruluğu belirlemek için sayıyı dizge değerine tercih edecektir. Yani, değerine bakılmaksızın $object instanceof Countable
bu geri dönecekse .(boolean) count($object)
(string) $object
Kullandığım test verilerinin davranışını ve diğer birkaç işlevin sonuçlarını burada görebilirsiniz . Bu küçük iframe'in sonuçlarını gözden geçirmek biraz zor, bu nedenle komut dosyası çıktısını tam sayfada görüntüleyebilirsiniz (bu URL belgelenmemiş olduğundan sonsuza kadar çalışmayabilir). Bu bağlantıların bir gün ölmesi durumunda , kodu pastebin'e de koyarım .
"Doğru olması gereken" ile olmaması gereken arasındaki çizgi oldukça keyfi; Kullandığım veriler ihtiyaçlarıma ve estetik tercihlerime göre kategorize edildi, sizinki farklılık gösterebilir.
isBoolean("")
yanlış döndürmelidir.