it-swarm.com.ru

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

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

250
laukok

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

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

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

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

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

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

Этот метод был опубликован @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
548
Brad

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.

31
wosis

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

16
Nishanth Shaan

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

$string = 'false';
$boolean = json_decode($string);
if($boolean) {
  // Do something
} else {
  //Do something else
}
10
souparno majumder
(boolean)json_decode(strtolower($string))

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

'true'  => true
'True'  => true
'1'     => true
'false' => false
'False' => false
'0'     => false
'foo'   => false
''      => false
7
mrded

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

$str = 'TRUE';

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

var_dump($boolean);

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

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

или же

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

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

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

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

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

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

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

3
kaiser

Если ваша «логическая» переменная происходит из глобального массива, такого как $ _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
SandroMarques

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

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

2
Nai

Ответ @GordonM хорош . Но он потерпит неудачу, если $string уже true (т. Е. Строка не строка, а логическое значение ИСТИНА) ... что кажется нелогичным.

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

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

Я делаю это таким образом, чтобы приводить любую нечувствительную к регистру версию строки «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
Syntax Error

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

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

  $my_istrue = true;
  echo 'hi '.strval($my_istrue); // returns "hi 1"
0
JSG

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

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

Меня запутали атрибуты шорткода 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']);
0
tomi

Я использую следующий подход:

$test = "true";

$test == 'false' ? $test = false : $test = true;

echo  $test;

if(empty($test)){
    echo "IT IS FALSE";
}

if($test){
     echo "IT IS TRUE";
}
0
user3785966