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


126

오늘 저는 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의 기본 함수가 있습니까?


코드에서 isBoolean("")false를 반환해야합니다.
BoltClock

허용 된 답변을 Eric Caron의 답변으로 변경하는 것을 고려해야합니다. 요청한 기능을 수행하는 기본 기능을 보여줍니다.
코드 사령관

1
PHP는 "false"라는 문자열이 아무 의미도없는 5 자에 불과 하다고 생각 하지 않습니다 . 그것들은 무언가 이므로 부울 값 true은 인간 독자에게도 평가 되지만 더 직관적 인 것처럼 보입니다 FALSE.
zeel

답변:


413

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이 반환됩니다.


이것은 받아 들여진 대답이어야합니다. 내장 PHP 함수는 직접 빌드하는 것보다 낫습니다. 바퀴를 재발 명할 필요가 없습니다! 너무 늦어서 너무 늦었다 : P
casraf

1
비교 값도 소문자입니까?
Mobiletainment

3
@Mobiletainment, 예-$ value (false, FALSE, FalSe 등)에 대해 상상할 수있는 모든 케이싱을 처리합니다.
Eric Caron

내 말에 테스트 케이스가 생겼다. 비교를 위해 === 대신 ==를 사용했습니다. 사람들을 혼동하지 않기 위해 내 이전 의견을 제거합니다.
andig

6
함수에 플래그 FILTER_NULL_ON_FAILURE를 추가하고 생각했던대로 filter_var()바꾸지 않아야하기 때문에 대답이 나를 지키지 FILTER_VALIDATE_BOOLEAN못했습니다. 이로 인해 다음과 같은 코드가 $bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
만들어졌습니다

14

그 이유는 및 (빈 문자열)을 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 (모든 자원 포함)로 간주됩니다.


2
+1 니스 (거기에 strtolower를 넣을 수는 있지만, 그것에 관한 것입니다.)
John Parker

middaparka는 strtolower ($ value)를 'false'와 비교하는 것을 의미한다고 생각합니다. 문자 '거짓'을 strtolower에 전달하는 것은 조금 .... daft? :)
Paul Dixon

@Paul Dixon Yup, 그것이 제가 언급 한 것입니다. :-)
John Parker

2
@Marco-if ($ value && strtolower ($ value)! == "faux") {프랑스어로 일하고 있다면; if ($ value && strtolower ($ value)! == "falsch") {독일어로; if ($ value && strtolower ($ value)! == "onwaar") {네덜란드어 ... PHP가 왜 기본으로 내장되어 있지 않은지 이해할 수 있습니다
Mark Baker

1
" 문자열이 아닌 문자열은"0 "을 제외하고 부울로 변환 할 때 true로 평가됩니다."
BoltClock

5

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";
}

4

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

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

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


이 기능은 완벽하게 작동합니다. 감사합니다! 그러나 귀하의 링크는 이제 404입니다.
servermanfail

3

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

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

1

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

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

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


1
truePHP에서 모든 문자열이 평가되는 것은 아닙니다 .
coreyward

1
수정하지 않고 명확하게 설명했습니다. "둘 다 문자열 [및 평가 true]"이라고 말하면 초보자에게 잘못된 인상을 줄 수 있습니다. 특히 문자열이 문자열이고 부울로 변환 될 때 내용이 중요하지 않은 엄격한 타이핑 규칙을 사용하는 다른 언어에서 루비).
coreyward

1
"PHP에서는 빈 문자열 만 거짓으로 평가됩니다." 그러나 비어 있지 않은 문자열은 "0"어떻습니까? 이것도 평가되지 false않습니까?
Sepster

0

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

    $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'

0

API가 "true"또는 "false"문자열 만 허용하고 다른 모든 항목은null 으로 설정 한 경우 다음을 시도하십시오.

$boolean = ['true' => true, 'false' => false][$inputString] ?? null;

이것은 $input객체가 아니라고 가정 합니다. 널 병합 ( ??)은 PHP 7.0에서 도입되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.