Разбор строки в логическое значение в PHP

Сегодня я играл с PHP, и я обнаружил, что строковые значения «true» и «false» неправильно обрабатываются в boolean в условии, например, рассматривая следующую функцию:

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 

Есть ли встроенная функция в PHP для синтаксического анализа строк «true» и «false» в boolean?

Solutions Collecting From Web of "Разбор строки в логическое значение в PHP"

Существует собственный PHP-метод, который использует метод filter_var PHP:

 $bool = filter_var($value, FILTER_VALIDATE_BOOLEAN); 

Согласно руководству PHP:

Возвращает TRUE для «1», «true», «on» и «yes». Возвращает FALSE в противном случае.

Если FILTER_NULL_ON_FAILURE установлен, FALSE возвращается только для «0», «false», «off», «no» и «», а NULL возвращается для всех небулевых значений.

Причина в том, что все строки оценивают true при преобразовании их в boolean, кроме "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 :

При преобразовании в boolean следующие значения считаются FALSE:

  • сама логическая ЛОЖЬ
  • целое число 0 (ноль)
  • поплавок 0.0 (ноль)
  • пустая строка и строка «0»,
  • массив с нулевыми элементами
  • специальный тип NULL (включая неустановленные переменные)
  • Объекты SimpleXML, созданные из пустых тегов

Каждое другое значение считается TRUE (включая любой ресурс).

В PHP только "0" или пустая строка принуждения к false; каждая другая непустая строка приводит к истинному. Из руководства :

При преобразовании в boolean следующие значения считаются FALSE :

  • пустая строка и строка «0»,

Вам нужно написать свою собственную функцию для обработки строк "true" vs "false" . Здесь я предполагаю, что все остальное по умолчанию имеет значение false:

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

На стороне примечание, которое можно легко свести к

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

Я использую эту конструкцию для преобразования строк в логические значения, поскольку для большинства других значений вы хотите true :

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

Недавно мне понадобилась «свободная» функция логического преобразования для обработки строк, подобных тем, о которых вы просите (между прочим). Я нашел несколько разных подходов и придумал большой набор тестовых данных для их запуска . Ничто не вполне соответствовало моим потребностям, поэтому я написал свои собственные:

 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 недокументирован, так что это может не работать навсегда). В случае, если эти ссылки однажды умрут, я добавлю код на пастебин .

Линия между тем, что «должно быть истинным» и что не должно быть довольно произвольным; данные, которые я использовал, классифицируются на основе моих потребностей и эстетических предпочтений, ваши могут отличаться.

Есть ли функция в PHP для синтаксического анализа строк «true» и «false» в boolean?

Нет – обе строки, и те, и другие (как вы говорите), оцениваете true . Только пустые строки оцениваются как false в PHP.

Вам нужно будет проверить это вручную. Если это вообще возможно, было бы лучше работать с «реальными» булевыми значениями.

Самый простой способ безопасного преобразования в логическое;

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