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

Ответ 1

Существует собственный метод 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 возвращается для всех небулевых значений.

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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