Как преобразовать строку в boolean
?
$string = 'false'; $test_mode_mail = settype($string,'boolean'); var_dump($test_mode_mail); if($test_mode_mail) echo 'test mode is on.';
он возвращается,
boolean true
но он должен быть boolean false
.
Строки всегда оценивают значение boolean true, если у них нет значения, которое считается «пустым» PHP (взято из документации для empty
):
""
(пустая строка); "0"
(0 в виде строки) Если вам нужно задать логическое значение на основе текстового значения строки, вам нужно будет проверить наличие или иное значение этого значения.
$test_mode_mail = $string === 'true'? true: false;
EDIT: приведенный выше код предназначен для ясности понимания. При фактическом использовании следующий код может быть более уместным:
$test_mode_mail = ($string === 'true');
Этот метод был отправлен @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
Строка "false"
на самом деле считается значением "TRUE"
помощью PHP. В документации говорится:
Чтобы явно преобразовать значение в boolean, используйте (bool) или (boolean) cast. Однако в большинстве случаев приведение не требуется, так как значение будет автоматически преобразовано, если для оператора, функции или структуры управления требуется логический аргумент.
См. Также Тип Жонглирование.
При преобразовании в boolean следующие значения считаются FALSE:
сама логическая ЛОЖЬ
целое число 0 (ноль)
поплавок 0.0 (ноль)
пустая строка и строка «0»,
массив с нулевыми элементами
объект с нулевыми переменными-членами (только для PHP 4)
специальный тип NULL (включая неустановленные переменные)
Объекты SimpleXML, созданные из пустых тегов
Каждое другое значение считается TRUE (включая любой ресурс).
поэтому, если вы это сделаете:
$bool = (boolean)"False";
или
$test = "false"; $bool = settype($test, 'boolean');
в обоих случаях $bool
будет TRUE
. Поэтому вы должны сделать это вручную, как предлагает GordonM.
При работе с Json мне пришлось отправить логическое значение в $ _POST.
У меня была аналогичная проблема, когда я сделал что-то вроде
if ($_POST['myVar'] == true) { // do stuff; }
Так как мой bool был превращен в укус json.
Чтобы преодолеть это, вы можете декодировать строку с помощью json_decode (). 😉
if( json_decode($_POST['myVar']) == true ) { //do your stuff; }
(обычно это должно работать с значениями bool, преобразованными в строку и отправленными на сервер также другими способами, кроме использования json)
Пожалуйста, отметьте в качестве ответа, если вы найдете это полезным, спасибо и пожелаете вам много солнца, ciao
вы можете использовать json_decode для декодирования того, что boolean
$string = 'false'; $boolean = json_decode($string); if($boolean) { // Do something } else { //Do something else }
(boolean)json_decode(strtolower($string))
Он обрабатывает все возможные варианты $string
'true' => true 'True' => true '1' => true 'false' => false 'False' => false '0' => false 'foo' => false '' => false
проще всего это сделать:
$str = 'TRUE'; $boolean = strtolower($str) == 'true' ? true : false; var_dump($boolean);
Выполняя это так, вы можете выполнить цикл «true», «TRUE», «false» или «FALSE» и получить значение строки в логическом виде.
function stringToBool($string){ return ( mb_strtoupper( trim( $string)) === mb_strtoupper ("true")) ? TRUE : FALSE; }
или
function stringToBool($string) { return filter_var($string, FILTER_VALIDATE_BOOLEAN); }
Другие ответы более усложняют ситуацию. Этот вопрос – просто логический вопрос. Просто верьте свое утверждение.
$boolString = 'false'; $result = 'true' === $boolString;
Теперь ваш ответ будет либо
false
, если строка была 'false'
, true
, если ваша строка была 'true'
. Я должен отметить, что filter_var( $boolString, FILTER_VALIDATE_BOOLEAN );
все равно будет лучшим вариантом, если вам нужно иметь строки, такие как on/yes/1
как псевдоним для true
.
Вы также можете использовать метод settype!
SetType ($ var, "Boolean") Echo $ var // см. 0 или 1
Я делаю это таким образом, чтобы на любой логической строке строка «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; }
Ответ от @GordonM хорош. Но это не сработает, если $string
уже true
(т. Е. Строка не является строкой, а логической TRUE) … что кажется нелогичным.
Расширяя его ответ, я бы использовал:
$test_mode_mail = ($string === 'true' OR $string === true));
Если ваша «логическая» переменная поступает из глобального массива, такого как $ _POST и $ _GET, вы можете использовать filter_input()
filter.
Пример для POST:
$isSleeping = filter_input(INPUT_POST, 'is_sleeping', FILTER_VALIDATE_BOOLEAN);
Если ваша «логическая» переменная поступает из другого источника, вы можете использовать filter_var()
filter.
Пример:
filter_var('true', FILTER_VALIDATE_BOOLEAN); // true
От php.net
public function strictBool($val=false){ return is_integer($val)?false:$val == 1; }
strval сделает это и многое другое.
См. Документы. http://php.net/manual/en/function.strval.php
$my_istrue = true; echo 'hi '.strval($my_istrue); // returns "hi 1"
Я запутался в атрибутах 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']);
Простым способом является проверка массива значений, которые вы считаете истинными.
$wannabebool = "false"; $isTrue = ["true",1,"yes","ok","wahr"]; $bool = in_array(strtolower($wannabebool),$isTrue);
Вы должны иметь возможность использовать boolean using (bool), но я не уверен, не проверяя, работает ли это в строках «true» и «false».
Это может стоить популярности, хотя
$myBool = (bool)"False"; if ($myBool) { //do something }
Стоит знать, что следующее будет оцениваться логическим False при вводе внутри
if()
Все остальные будут оцениваться как истинные.
Как описано здесь: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting