Как преобразовать строку в логический PHP

245

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

$string = 'false';

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

var_dump($test_mode_mail);

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

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

булево верно

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

  • 0
    Почему кто-то ответил о $ bool = !! $ string1?
  • 1
    @zloctb, потому что это не отвечает на вопрос. !!$string1 вернет логическое значение строки, обозначенной в ответе с самым высоким рейтингом.
Теги:
string
casting
boolean

20 ответов

278
Лучший ответ

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

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

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

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

EDIT: приведенный выше код предназначен для ясности понимания. При фактическом использовании более подходящим может быть следующий код:

$test_mode_mail = ($string === 'true');
  • 4
    Я рекомендую всегда использовать строгое сравнение, если вы не уверены, что делаете: $string === 'true'
  • 205
    Я нашел это - filter_var($string, FILTER_VALIDATE_BOOLEAN); Это хорошая вещь?
Показать ещё 9 комментариев
561

Этот метод был отправлен @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
  • 5
    Согласно документации, эта функция доступна для PHP 5> = 5.2.0. php.net/manual/en/function.filter-var.php
  • 3
    Мне действительно нравится это решение для установки логических значений на основе атрибутов шорткода WordPress, которые имеют значения, такие как true, false, on, 0 и т. Д. Отличный ответ, безусловно, должен быть принятым ответом.
Показать ещё 2 комментария
31

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

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

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

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

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

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

  • поплавок 0.0 (ноль)

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

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

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

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

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

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

поэтому если вы выполните:

$bool = (boolean)"False";

или

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

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

  • 1
    Эмм, конечно, нижний возвращает ложь. Фактически, это приводит к фатальной ошибке :) «Фатальная ошибка: только переменные могут быть переданы по ссылке». $ a = 'False'; SetType ($ а, 'логическое'); var_dump ($ а); действительно вернет ложь.
16

При работе с 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.)

  • 0
    спасибо это помогло мне.
  • 0
    ^^ мне тоже спасибо
10

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

$string = 'false';
$boolean = json_decode($string);
if($boolean) {
  // Do something
} else {
  //Do something else
}
  • 0
    json_decode также преобразуется в целое число, если заданная строка является целым числом
  • 1
    Да, это правда, но упоминается, что строка содержит логическое значение
6
(boolean)json_decode(strtolower($string))

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

'true'  => true
'True'  => true
'1'     => true
'false' => false
'False' => false
'0'     => false
'foo'   => false
''      => false
  • 0
    Как насчет on и off ?
  • 0
    @ Cyclonecode, он не справляется с этим.
4

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

$str = 'TRUE';

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

var_dump($boolean);

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

3

Вы можете использовать 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

3
function stringToBool($string){
    return ( mb_strtoupper( trim( $string)) === mb_strtoupper ("true")) ? TRUE : FALSE;
}

или

function stringToBool($string) {
    return filter_var($string, FILTER_VALIDATE_BOOLEAN);
}
3

Другие ответы более усложняют ситуацию. Этот вопрос - это просто логический вопрос. Просто верните свое утверждение.

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

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

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

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

2

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

Пример для POST:

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

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

Пример:

filter_var('true', FILTER_VALIDATE_BOOLEAN); // true
2

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

$test_var = 'False';
$test_var = strtolower(trim($test_var)) == 'false' ? FALSE : $test_var;
$result = (boolean) $test_var;

Или как функция:

function safeBool($test_var){
    $test_var = strtolower(trim($test_var)) == 'false' ? FALSE : $test_var;
    return (boolean) $test_var;
}
2

Ответ от @GordonM хорош. Но это не сработает, если $string уже true (т.е. Строка не строка, а логическая TRUE)... которая кажется нелогичной.

Расширяя свой ответ, я бы использовал:

$test_mode_mail = ($string === 'true' OR $string === true));
2

Вы также можете использовать метод settype!

SetType ($ Var, "Boolean" ) Echo $var//см. 0 или 1

0

хмммм у меня была такая проблема, и я сделал в простой форме, и она работает нормально

    $string = 'false';
    if( $string == 'true'){
        $string = true;     
    }else if($string == 'false'){
        $string= false;     
    }
0

Простым способом является проверка на массив значений, который вы считаете истинным.

$wannabebool = "false";
$isTrue = ["true",1,"yes","ok","wahr"];
$bool = in_array(strtolower($wannabebool),$isTrue);
0

Я запутался в атрибутах shortcode wordpress, я решил написать пользовательскую функцию для обработки всех возможностей. возможно, это полезно для кого-то:

function stringToBool($str){
    if($str === 'true' || $str === 'TRUE' || $str === 'True' || $str === 'on' || $str === 'On' || $str === 'ON'){
        $str = true;
    }else{
        $str = false;
    }
    return $str;
}
stringToBool($atts['onOrNot']);
  • 1
    Во-первых, я искал помощи, но не нашел ничего проще, чем надеялся. Вот почему я написал свою собственную функцию. не стесняйтесь использовать его.
0

strval сделает это и многое другое.

См. Документы. http://php.net/manual/en/function.strval.php

  $my_istrue = true;
  echo 'hi '.strval($my_istrue); // returns "hi 1"
  • 0
    Это не то, что спросили. Вопрос в том, как преобразовать строку в логическое значение.
0

От php.net

public function strictBool($val=false){
    return is_integer($val)?false:$val == 1;
}
-3

Вы должны иметь возможность использовать boolean using (bool), но я не уверен, не проверяя, работает ли это в строках "true" и "false".

Это может стоить популярность, хотя

$myBool = (bool)"False"; 

if ($myBool) {
    //do something
}

Стоит знать, что следующее будет оцениваться логическим False при вводе внутри

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

Все остальные будут оцениваться как true.

Как описано здесь: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

  • 6
    В ответ на предположение в первом абзаце: использование явного приведения к логическому типу преобразует "false" в true .
  • 2
    Это выведет «true» $myBool = (bool)"False"; if ($myBool) { echo "true"; }
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню