Как преобразовать строку в логический PHP - PullRequest
274 голосов
/ 07 сентября 2011

Как мне преобразовать строку в boolean?

$string = 'false';

$test_mode_mail = settype($string, 'boolean');

var_dump($test_mode_mail);

if($test_mode_mail) echo 'test mode is on.';

возвращается,

логическое значение true

но это должно быть boolean false.

Ответы [ 20 ]

577 голосов
/ 26 февраля 2013

Этот метод был опубликован @lauthiamkok в комментариях. Я публикую это здесь в качестве ответа, чтобы привлечь к нему больше внимания.

В зависимости от ваших потребностей, вам следует рассмотреть возможность использования filter_var() с флагом FILTER_VALIDATE_BOOLEAN.

filter_var(    'true', FILTER_VALIDATE_BOOLEAN); // true
filter_var(         1, FILTER_VALIDATE_BOOLEAN); // true
filter_var(       '1', FILTER_VALIDATE_BOOLEAN); // true
filter_var(      'on', FILTER_VALIDATE_BOOLEAN); // true
filter_var(     'yes', FILTER_VALIDATE_BOOLEAN); // true

filter_var(   'false', FILTER_VALIDATE_BOOLEAN); // false
filter_var(         0, FILTER_VALIDATE_BOOLEAN); // false
filter_var(       '0', FILTER_VALIDATE_BOOLEAN); // false
filter_var(     'off', FILTER_VALIDATE_BOOLEAN); // false
filter_var(      'no', FILTER_VALIDATE_BOOLEAN); // false
filter_var('asdfasdf', FILTER_VALIDATE_BOOLEAN); // false
filter_var(        '', FILTER_VALIDATE_BOOLEAN); // false
filter_var(      null, FILTER_VALIDATE_BOOLEAN); // false
296 голосов
/ 07 сентября 2011

Строки всегда имеют логическое значение true, если только они не имеют значения, которое PHP считает «пустым» (взято из документации для empty):

  1. "" (пустая строка);
  2. "0" (0 в виде строки)

Если вам нужно установить логическое значение на основе текстового значения строки, то вам нужно будет проверить наличие или отсутствие этого значения.

$test_mode_mail = $string === 'true'? true: false;

РЕДАКТИРОВАТЬ: приведенный выше код предназначен для ясности понимания. При фактическом использовании следующий код может быть более подходящим:

$test_mode_mail = ($string === 'true');
31 голосов
/ 07 сентября 2011

String "false" фактически считается значением "TRUE" в PHP. В документации написано:

Чтобы явно преобразовать значение в логическое значение, используйте (bool) или (логическое) слепки. Тем не менее, в большинстве случаев приведение не требуется, так как значение будет автоматически преобразован, если оператор, функция или контроль структура требует логического аргумента.

См. Также Тип Жонглирование.

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

  • само логическое значение ЛОЖЬ

  • целое число 0 (ноль)

  • Поплавок 0,0 (ноль)

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

  • массив с нулевыми элементами

  • объект с нулевыми переменными-членами (только PHP 4)

  • специальный тип NULL (включая неустановленные переменные)

  • Объекты SimpleXML, созданные из пустых тегов

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

так что если вы делаете:

$bool = (boolean)"False";

или

$test = "false";
$bool = settype($test, 'boolean');

в обоих случаях $bool будет TRUE. Поэтому вы должны сделать это вручную, как предлагает GordonM.

16 голосов
/ 02 ноября 2014

При работе с JSON мне пришлось отправлять логическое значение через $_POST.У меня была похожая проблема, когда я делал что-то вроде:

if ( $_POST['myVar'] == true) {
    // do stuff;
}

В приведенном выше коде мой логический тип был преобразован в строку JSON.

Чтобы преодолеть это, вы можете декодировать строку, используяjson_decode():

//assume that : $_POST['myVar'] = 'true';
 if( json_decode('true') == true ) { //do your stuff; }

(Это обычно должно работать с логическими значениями, преобразованными в строку и отправленными на сервер и другими способами, т. Е. Отличными от использования JSON.)

11 голосов
/ 27 июля 2016

вы можете использовать json_decode для декодирования этого логического

$string = 'false';
$boolean = json_decode($string);
if($boolean) {
  // Do something
} else {
  //Do something else
}
7 голосов
/ 20 июня 2017
(boolean)json_decode(strtolower($string))

Он обрабатывает все возможные варианты $string

'true'  => true
'True'  => true
'1'     => true
'false' => false
'False' => false
'0'     => false
'foo'   => false
''      => false
4 голосов
/ 10 августа 2018

Вы можете использовать boolval($strValue)

Примеры:

<?php
echo '0:        '.(boolval(0) ? 'true' : 'false')."\n";
echo '42:       '.(boolval(42) ? 'true' : 'false')."\n";
echo '0.0:      '.(boolval(0.0) ? 'true' : 'false')."\n";
echo '4.2:      '.(boolval(4.2) ? 'true' : 'false')."\n";
echo '"":       '.(boolval("") ? 'true' : 'false')."\n";
echo '"string": '.(boolval("string") ? 'true' : 'false')."\n";
echo '"0":      '.(boolval("0") ? 'true' : 'false')."\n";
echo '"1":      '.(boolval("1") ? 'true' : 'false')."\n";
echo '[1, 2]:   '.(boolval([1, 2]) ? 'true' : 'false')."\n";
echo '[]:       '.(boolval([]) ? 'true' : 'false')."\n";
echo 'stdClass: '.(boolval(new stdClass) ? 'true' : 'false')."\n";
?>

Документация http://php.net/manual/es/function.boolval.php

4 голосов
/ 19 апреля 2016

проще всего сделать это:

$str = 'TRUE';

$boolean = strtolower($str) == 'true' ? true : false;

var_dump($boolean);

Делая это таким образом, вы можете циклически проходить ряды 'true', 'TRUE', 'false' или 'FALSE' и получать строковое значение в логическое значение.

3 голосов
/ 23 ноября 2017

Если ваша «логическая» переменная происходит из глобального массива, такого как $ _POST и $ _GET, вы можете использовать функцию фильтра filter_input().

Пример для POST:

$isSleeping  = filter_input(INPUT_POST, 'is_sleeping',  FILTER_VALIDATE_BOOLEAN);

Если ваша «логическая» переменная исходит из другого источника, вы можете использовать filter_var() функцию фильтра.

Пример:

filter_var('true', FILTER_VALIDATE_BOOLEAN); // true
3 голосов
/ 03 сентября 2013

Другие ответы более сложны.Этот вопрос просто логика вопрос.Просто сделайте правильное утверждение.

$boolString = 'false';
$result = 'true' === $boolString;

Теперь ваш ответ будет либо

  • false, если строка была 'false',
  • или true, если ваша строка была 'true'.

Я должен отметить, что filter_var( $boolString, FILTER_VALIDATE_BOOLEAN ); по-прежнему будет лучшим вариантом , если вам нужно иметь строки вроде on/yes/1в качестве псевдонима для true.

...