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

318

Как я могу преобразовать строку в 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.

laukok
источник
Почему кто-то ответил о $ bool = !! $ string1?
zloctb
1
@zloctb, потому что это не отвечает на вопрос. !!$string1вернет логическое значение строки, обозначенной в ответе с самым высоким рейтингом.
Дэвид Баркер

Ответы:

347

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

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

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

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

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

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

или, возможно, использование filter_varфункции может охватывать больше логических значений:

filter_var($string, FILTER_VALIDATE_BOOLEAN);

filter_varохватывает весь диапазон значений, в том числе значений truthy "true", "1", "yes"и "on". Смотрите здесь для более подробной информации.

GordonM
источник
5
Я рекомендую всегда использовать строгое сравнение, если вы не уверены, что делаете:$string === 'true'
Знаркус
248
Я нашел это - filter_var($string, FILTER_VALIDATE_BOOLEAN);это хорошо?
Laukok
10
Тройной не кажется необходимым. Почему бы просто не установить $ test_mode_mail равным значению неравенства? $ test_mode_mail = $ string === 'true'
Тим Бэнкс
3
Но как насчет 1/0, ИСТИНА / ЛОЖЬ? Я думаю, что ответ @lauthiamkok - лучший.
рябенко-про
1
@FelipeTadeo Я говорю о том, как PHP оценивает строки в отношении логических операций, я никогда не упоминал eval () и никогда не рекомендовал бы использовать его ни при каких обстоятельствах. Строка "(3 <5)" будет оценена PHP как логическое значение true, потому что она не пустая.
GordonM
648

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

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

filter_var(    true, FILTER_VALIDATE_BOOLEAN); // true
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(   '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
Westy92
4
Мне действительно нравится это решение для установки логических значений на основе атрибутов шорткода WordPress, которые имеют значения, такие как true, false, on, 0 и т. Д. Отличный ответ, безусловно, должен быть принятым ответом.
AndyWarren
11
filter_var($answer, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)работал еще лучше для меня. См. Php.net/manual/en/function.filter-var.php#121263
Райан
!! Важная заметка !! filter_var возвращает также FALSE, если фильтр не работает. Это может создать некоторые проблемы.
AFA Med
35

Строка "false" на самом деле считается "TRUE"значением в PHP. Документация гласит:

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

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

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

  • сам логический FALSE

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

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

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

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

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

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

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

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

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

$bool = (boolean)"False";

или

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

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

wosis
источник
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.)

Нишант Шаан
источник
11

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

$string = 'false';
$boolean = json_decode($string);
if($boolean) {
  // Do something
} else {
  //Do something else
}
Супарно Маюмдер
источник
json_decode также преобразуется в целое число, если заданная строка является целым числом
Mihai Răducanu
1
Да, это правда, но упоминается, что строка содержит логическое значение
souarno majumder
8
(boolean)json_decode(strtolower($string))

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

'true'  => true
'True'  => true
'1'     => true
'false' => false
'False' => false
'0'     => false
'foo'   => false
''      => false
mrded
источник
Что о onи off?
Cyclonecode
7

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

Пример для POST:

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

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

Пример:

filter_var('true', FILTER_VALIDATE_BOOLEAN); // true
SandroMarques
источник
7

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

anayarojo
источник
2
echo boolval('false');=> 1
Мубашар
Вы можете использовать echo (int)'false;илиecho intval('false');
anayarojo
@anayarojo (int)'true'и intval('true')оба возвращают также 0 (все строки)
sketchyTech
4

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

$str = 'TRUE';

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

var_dump($boolean);

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

Брэндон Сандерс
источник
3

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

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

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

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

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

кайзер
источник
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
filter_var($string, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);

$string = 1; // true
$string ='1'; // true
$string = 'true'; // true
$string = 'trUe'; // true
$string = 'TRUE'; // true
$string = 0; // false
$string = '0'; // false
$string = 'false'; // false
$string = 'False'; // false
$string = 'FALSE'; // false
$string = 'sgffgfdg'; // null

Вы должны указать

FILTER_NULL_ON_FAILURE
в противном случае вы всегда получите false, даже если $ string содержит что-то еще.

yoben
источник
2

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

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

Най
источник
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(то есть строка не строка, а логическое ИСТИНА) ... что кажется нелогичным.

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

$test_mode_mail = ($string === 'true' OR $string === true));
Ema4rl
источник
0

Меня запутали атрибуты шорткода 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
Во-первых, я искал помощи, но не нашел ничего проще, чем надеялся. Вот почему я написал свою собственную функцию. не стесняйтесь использовать его.
Томи
-1

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

$wannabebool = "false";
$isTrue = ["true",1,"yes","ok","wahr"];
$bool = in_array(strtolower($wannabebool),$isTrue);
Тажин
источник
-1

Отредактировано, чтобы показать возможность, не упомянутую здесь, потому что мой первоначальный ответ был далеко не связан с вопросом ОП.

preg_match (); Возможно использовать. Тем не менее, в большинстве приложений это будет гораздо тяжелее, чем другие ответы здесь.

if (preg_match("/true/i", "true PHP is a web scripting language of choice.")) {
    echo "<br><br>Returned true";
} else {
    echo "<br><br>Returned False";
}

/(?:true)|(?:1)/iМожет также использоваться при необходимости в определенных ситуациях. Он не вернется правильно, когда оценивает строку, содержащую как «ложь», так и «1».

JSG
источник
Это не то, что спросили. Вопрос в том, как преобразовать строку в логическое значение.
mrded
Мрден: Я неправильно понял вопрос, извиняюсь. Таким образом, в хорошей форме я добавлю еще одну возможность, не упомянутую здесь.
JSG
-1

В PHP вы можете просто преобразовать значение в логическое значение, используя double not operator ( !!):

var_dump(!! true);     // true
var_dump(!! "Hello");  // true
var_dump(!! 1);        // true
var_dump(!! [1, 2]);   // true
var_dump(!! false);    // false
var_dump(!! null);     // false
var_dump(!! []);       // false
var_dump(!! 0);        // false
var_dump(!! '');       // false
AliN11
источник
-4

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

Это может стоить, хотя поп

$myBool = (bool)"False"; 

if ($myBool) {
    //do something
}

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

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

Все остальное оценит как истинное.

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

dougajmcdonald
источник
6
В ответ на предположение в вашем первом абзаце: использование явного приведения к логическому приведёт "false"к true.
Марк Эмери
2
Это напечатает "true"$myBool = (bool)"False"; if ($myBool) { echo "true"; }
SSH This
2
Это неправильно, строки оцениваются как true, если они не содержат "" или "0".
Майкл Дж. Калкинс