최근에 요청한 것과 같은 문자열을 처리하기 위해 "느슨한"부울 변환 함수가 필요했습니다. 나는 몇 가지 다른 접근법을 발견하고이를 통해 테스트 데이터 세트를 만들어 냈다 . 내 필요에 맞는 것은 없어서 직접 작성했습니다.
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("")
false를 반환해야합니다.