เมื่อเร็ว ๆ นี้ฉันต้องการฟังก์ชันการแปลงบูลีนแบบ "หลวม" เพื่อจัดการกับสตริงเช่นเดียวกับที่คุณกำลังถามถึง (เหนือสิ่งอื่นใด) ฉันพบวิธีการที่แตกต่างกันสองสามวิธีและได้รับข้อมูลการทดสอบจำนวนมากเพื่อดำเนินการเหล่านั้น ไม่มีอะไรที่ตรงกับความต้องการของฉันดังนั้นฉันจึงเขียนของตัวเอง:
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 นั้นไม่มีเอกสารดังนั้นจึงอาจใช้ไม่ได้ตลอดไป) ในกรณีที่ลิงก์เหล่านั้นหายไปในบางวันฉันก็ใส่รหัสบน pastebinเช่นกัน
เส้นแบ่งระหว่างสิ่งที่ "ควรจะเป็นจริง" และสิ่งที่ไม่ควรเป็นไปตามอำเภอใจ ข้อมูลที่ฉันใช้ถูกจัดหมวดหมู่ตามความต้องการและความชอบด้านความงามของฉันข้อมูลของคุณอาจแตกต่างกัน
isBoolean("")
ควรส่งคืนเท็จ