Разбор строки в логическое значение в PHP - PullRequest
114 голосов
/ 23 января 2011

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

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" и"ложные" строки в логическое значение?

Ответы [ 7 ]

376 голосов
/ 18 мая 2012

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

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);

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

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

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

14 голосов
/ 23 января 2011

Причина в том, что все строки оцениваются как 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:

При преобразовании в логическое значение следующие значения считаются ЛОЖНЫМИ:

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

Любое другое значение считается ИСТИННЫМ (включая любой ресурс).

5 голосов
/ 23 января 2011

Только в PHP "0" или пустая строка приводит к значению false;любая другая непустая строка приводит к истине.Из руководства :

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

  • пустая строка и строка "0 "

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

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

На примечании стороны, которое может быть легко сжато до

function isBoolean($value) {
   return $value === "true";
}
4 голосов
/ 16 июля 2012

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

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 .

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

3 голосов
/ 23 января 2011

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

$str = "true";
$bool = !in_array($str, array("false", "", "0", "no", "off"));
1 голос
/ 23 января 2011

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

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

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

0 голосов
/ 28 марта 2013

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

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