[php] PHP에서 문자열을 부울 값으로 구문 분석

오늘 저는 PHP를 가지고 놀았는데, 문자열 값 “true”와 “false”가 다음 함수를 고려하는 조건에서 부울로 올바르게 구문 분석되지 않는다는 것을 발견했습니다.

function isBoolean($value) {
   if ($value) {
      return true;
   } else {
      return false;
   }
}

내가 실행하면 :

isBoolean("true") // Returns true
isBoolean("") // Returns false
isBoolean("false") // Returns true, instead of false
isBoolean("asd") // Returns true, instead of false

“1”및 “0”값으로 만 작동하는 것 같습니다.

isBoolean("1") // Returns true
isBoolean("0") // Returns false

“true”및 “false”문자열을 부울로 구문 분석하는 PHP의 기본 함수가 있습니까?



답변

PHP의 filter_var 메소드를 사용하는 네이티브 PHP 메소드가 있습니다 :

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);

PHP 매뉴얼 에 따르면 :

“1”, “true”, “on”및 “yes”에 대해 TRUE를 리턴합니다. 그렇지 않으면 FALSE를 반환합니다.

FILTER_NULL_ON_FAILURE가 설정되면 “0”, “false”, “off”, “no”및 “”에 대해서만 FALSE가 반환되고 부울이 아닌 모든 값에 대해 NULL이 반환됩니다.


답변

그 이유는 및 (빈 문자열)을 true제외한 모든 문자열 을 부울로 변환 할 때 평가하기 때문입니다 ."0"""

다음 함수는 원하는 것을 정확하게 수행합니다. PHP와 똑같이 동작하지만 문자열 "false"false다음 과 같이 평가합니다 .

function isBoolean($value) {
   if ($value && strtolower($value) !== "false") {
      return true;
   } else {
      return false;
   }
}

설명서는 다음을 설명합니다 : http://php.net/manual/en/language.types.boolean.php :

부울로 변환 할 때 다음 값은 FALSE로 간주됩니다.

  • 부울 거짓 자체
  • 정수 0 (영)
  • float 0.0 (영)
  • 빈 문자열 및 문자열 “0”
  • 요소가없는 배열
  • 특수 유형 NULL (설정되지 않은 변수 포함)
  • 빈 태그에서 생성 된 SimpleXML 객체

다른 모든 값은 TRUE (모든 자원 포함)로 간주됩니다.


답변

PHP에서만 "0"또는 빈 문자열은 false로 강제됩니다. 비어 있지 않은 다른 모든 문자열은 true로 강제됩니다. 로부터 수동 :

부울로 변환 할 때 다음 값이 고려됩니다 FALSE.

  • 빈 문자열 및 문자열 “0”

문자열 "true"vs 를 처리하려면 고유 한 함수를 작성해야합니다 "false". 여기서는 다른 모든 기본값이 false라고 가정합니다.

function isBoolean($value) {
   if ($value === "true") {
      return true;
   } else {
      return false;
   }
}

쉽게 응축 될 수있는 사이드 노트

function isBoolean($value) {
   return $value === "true";
}


답변

최근에 요청한 것과 같은 문자열을 처리하기 위해 “느슨한”부울 변환 함수가 필요했습니다. 나는 몇 가지 다른 접근법을 발견하고이를 통해 테스트 데이터 세트를 만들어 냈다 . 내 필요에 맞는 것은 없어서 직접 작성했습니다.

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에 올려 놓습니다 .

“참이되어야하는 것”과해서는 안되는 것 사이의 선은 꽤 임의적입니다. 내가 사용한 데이터는 내 요구와 미적 취향에 따라 분류되며 귀하의 데이터는 다를 수 있습니다.


답변

true대부분의 다른 값 을 원 하기 때문에이 구문을 사용하여 문자열을 부울로 모핑 합니다.

$str = "true";
$bool = !in_array($str, array("false", "", "0", "no", "off"));


답변

PHP에서 “true”및 “false”문자열을 부울로 구문 분석하는 함수가 있습니까?

아니오-둘 다 문자열이며, 말한대로 모두 문자열로 평가됩니다 true. falsePHP 에서는 빈 문자열 만 평가됩니다 .

이를 수동으로 테스트해야합니다. 그러나 가능하다면 “실제”부울 값으로 작업하는 것이 좋습니다.


답변

부울로 안전하게 변환하는 가장 쉬운 방법;

    $flag = 'true';

    if( filter_var( $flag,FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE ) !== null) {
      $flag = filter_var($flag,FILTER_VALIDATE_BOOLEAN);
    }

    gettype($flag); // Would Return 'Boolean'
    echo 'Val: '.$flag; // Would Output 'Val: 1'