Gần đây tôi cần một hàm chuyển đổi boolean "lỏng lẻo" để xử lý các chuỗi như chuỗi bạn đang hỏi (trong số những thứ khác). Tôi tìm thấy một vài cách tiếp cận khác nhau và đưa ra một bộ dữ liệu thử nghiệm lớn để chạy qua chúng . Không có gì khá phù hợp với nhu cầu của tôi nên tôi đã tự viết:
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;
}
}
Lưu ý rằng đối với các đối tượng có thể đếm được và có thể truyền chuỗi, điều này sẽ ưu tiên đếm trên giá trị chuỗi để xác định tính trung thực. Đó là, nếu $object instanceof Countable
điều này sẽ trở lại (boolean) count($object)
bất kể giá trị của (string) $object
.
Bạn có thể thấy hành vi cho dữ liệu thử nghiệm tôi đã sử dụng cũng như kết quả cho một số chức năng khác tại đây . Thật khó để lướt qua các kết quả từ iframe nhỏ đó, vì vậy bạn có thể xem đầu ra tập lệnh trong một trang đầy đủ (thay vào đó URL đó không có giấy tờ để điều này có thể không hoạt động mãi mãi). Trong trường hợp các liên kết đó chết một ngày nào đó, tôi cũng đặt mã lên pastebin .
Ranh giới giữa những gì "nên là đúng" và những gì không nên là khá độc đoán; dữ liệu tôi sử dụng được phân loại dựa trên nhu cầu và sở thích thẩm mỹ của tôi, dữ liệu của bạn có thể khác nhau.
isBoolean("")
nên trả về false.