Як перетворити рядок в булевий 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.


Чому хтось відповів про $ bool = !! $ string1?
zloctb

1
@zloctb, оскільки він не відповідає на питання. !!$string1поверне булевий показник рядка, викладеного у відповіді з найвищим рейтингом.
Девід Баркер

Відповіді:


347

Рядки завжди оцінюють як булеві істинні, якщо вони не мають значення, яке PHP вважає "порожнім": взято з документації наempty :

  1. "" (порожній рядок);
  2. "0" (0 як рядок)

Якщо вам потрібно встановити булеве значення на основі текстового значення рядка, вам потрібно буде перевірити наявність чи інше цього значення.

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

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

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

або, можливо, використання filter_varфункції може охопити більше булевих значень:

filter_var($string, FILTER_VALIDATE_BOOLEAN);

filter_varохоплює весь діапазон значень, в тому числі значень truthy "true", "1", "yes"і "on". Дивіться тут для більш детальної інформації.


5
Я рекомендую завжди використовувати суворе порівняння, якщо ви не впевнені, що робите:$string === 'true'
Znarkus

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 як булева істина, оскільки вона не порожня.
GordonM

647

Цей метод опублікував @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
Ryan

!! Важлива примітка !! filter_var також повертає НЕЖАЛЬНО, якщо фільтр не працює. Це може створити деякі проблеми.
AFA Med

35

Рядок "false" насправді вважається "TRUE"значенням PHP. Документація говорить:

Щоб явно перетворити значення на булеве, використовуйте касти (bool) або (boolean). Однак у більшості випадків подання є непотрібним, оскільки значення буде автоматично перетворено, якщо оператор, функція або керуюча структура потребує булевого аргументу.

Дивіться також Тип жонглювання.

При переході в булеві значення наступні значення вважаються ЛІЖНІМ:

  • булева ЛАШКА сама

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

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

  • порожній рядок і рядок "0"

  • масив з нульовими елементами

  • об'єкт із змінними нульового члена (лише PHP 4)

  • спеціальний тип NULL (включаючи невстановлені змінні)

  • Об'єкти SimpleXML, створені з порожніх тегів

Кожне інше значення вважається ПРАВИЛЬНИМ (включаючи будь-який ресурс).

тому якщо ви робите:

$bool = (boolean)"False";

або

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

в обох випадках $boolбуде TRUE. Тож вам доведеться робити це вручну, як пропонує GordonM.


1
Юм, звичайно, нижній повертає помилкове. Насправді це кидає фатальну :) "Фатальна помилка: Лише змінні можуть передаватися за посиланням". $ a = 'Неправдивий'; постоянний тип ($ a, 'булевий'); var_dump ($ a); дійсно поверне помилкове.
Роб

16

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

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

У наведеному вище коді мій Boolean був перетворений у рядок 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
Так, це правда, але згадується, що струна має булеве значення
souparno majumder

8
(boolean)json_decode(strtolower($string))

Він обробляє всі можливі варіанти $string

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

Що про 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

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


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
інакше ви завжди будете помилковими, навіть якщо $ string містить щось інше.


2

Ви також можете скористатися методом stalype!

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(тобто рядок не є рядком, а булевим TRUE) ... що здається нелогічним.

Розширюючи свою відповідь, я б використав:

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

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
я шукав допомоги, в першу чергу, але не знайшов нічого такого простого, як я сподівався. ось чому я написав власну функцію. сміливо використовуйте його.
tomi

-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Також може використовуватися при необхідності в певних ситуаціях. Він не повернеться правильно, коли він оцінить рядок, що містить і "false", і "1".


Це не те, про що питали. Питання в тому, як перетворити рядок у булеву.
mrded

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

-1

У PHP ви просто можете перетворити значення в булеве, використовуючи подвійний оператор ( !!):

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

-4

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

Це, можливо, варто попсу

$myBool = (bool)"False"; 

if ($myBool) {
    //do something
}

Варто знати, що наступне буде оцінювати булеву помилкову при покладенні всередину

if()
  • булева ЛАШКА сама
  • ціле число 0 (нуль)
  • поплавок 0,0 (нуль)
  • порожній рядок і рядок "0"
  • масив з нульовими елементами
  • об'єкт із змінними нульового члена (лише PHP 4)
  • спеціальний тип NULL (включаючи невстановлені змінні)
  • Об'єкти SimpleXML, створені з порожніх тегів

Все інше буде оцінено як справжнє.

Як описано тут: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting


6
У відповідь на здогадки у вашому першому абзаці: використання явного амплуа в boolean перетвориться "false"в true.
Марк Амері

2
Це надрукує "справжнє"$myBool = (bool)"False"; if ($myBool) { echo "true"; }
SSH

2
Це неправильно, рядки оцінюються як істинні, якщо вони не містять "" або "0".
Майкл Дж. Калкінс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.