Jak przekonwertować string do boolean php

Jak mogę przekonwertować string na boolean?

$string = 'false';

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

var_dump($test_mode_mail);

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

Zwraca,

Boolean true

Ale powinno być boolean false.

Author: dreftymac, 2011-09-07

18 answers

Ciągi zawsze oceniają na boolean true, chyba że mają wartość, która jest uważana za" pustą " przez PHP (zaczerpniętą z dokumentacji dla empty):

  1. "" (pusty łańcuch);
  2. "0" (0 jako ciąg znaków)

Jeśli chcesz ustawić wartość logiczną opartą na wartości tekstowej łańcucha znaków, musisz sprawdzić obecność lub nie tej wartości.

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

EDIT: powyższy kod jest przeznaczony dla jasności zrozumienia. W rzeczywistym użyciu następujący kod może być bardziej odpowiedni:

$test_mode_mail = ($string === 'true');
 272
Author: GordonM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-28 12:09:37

Ta metoda została opublikowana przez @ lauthiamkok w komentarzach. Zamieszczam to tutaj jako odpowiedź, aby zwrócić na to większą uwagę.

W zależności od potrzeb, należy rozważyć użycie filter_var() z flagą 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
 503
Author: Brad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-18 13:47:47

Łańcuch "false" jest w rzeczywistości uważany za wartość "TRUE" przez PHP. Dokumentacja mówi:

Aby jawnie przekonwertować wartość na wartość logiczną, użyj (bool) lub (boolean) odlewy. Jednak w większości przypadków obsada jest niepotrzebna, ponieważ wartość zostanie automatycznie przekształcona, jeśli operator, funkcja lub sterowanie struktura wymaga argumentu logicznego.

Zobacz też

Podczas konwersji na wartość logiczną następujące wartości są uważane za FALSE:

  • Sam boolean FALSE

  • Liczba całkowita 0 (zero)

  • Float 0.0 (zero)

  • Pusty łańcuch, a łańcuch "0"

  • Tablica z zerowymi elementami

  • Obiekt z zerowymi zmiennymi składowymi (tylko PHP 4)

  • Specjalny typ NULL (zawierający zmienne unset)

  • Obiekty SimpleXML utworzone z pustych tagów

Co drugi wartość jest uważana za prawdziwą(w tym za dowolny zasób).

Więc jeśli to zrobisz:

$bool = (boolean)"False";

Lub

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

W obu przypadkach $bool będzie TRUE. Więc musisz to zrobić ręcznie, jak sugeruje GordonM.

 30
Author: wosis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-28 09:55:18

Podczas pracy z JSON, musiałem wysłać wartość logiczną przez $_POST. Miałem podobny problem gdy robiłem coś takiego:

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

W powyższym kodzie mój Boolean został przekonwertowany na ciąg JSON.

Aby to przezwyciężyć, możesz rozszyfrować łańcuch za pomocą json_decode():

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

(powinno to normalnie działać z wartościami logicznymi przekonwertowanymi na string i wysyłanymi do serwera również w inny sposób, np. inny niż użycie JSON.)

 14
Author: Nishanth Shaan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-03 12:39:22

Możesz użyć json_decode do dekodowania tego logicznego

$string = 'false';
$boolean = json_decode($string);
if($boolean) {
  // Do something
} else {
  //Do something else
}
 10
Author: souparno majumder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-27 14:44:48
(boolean)json_decode(strtolower($string))

Obsługuje wszystkie możliwe warianty $string

'true'  => true
'True'  => true
'1'     => true
'false' => false
'False' => false
'0'     => false
'foo'   => false
''      => false
 6
Author: mrded,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-20 10:31:35

Najprostszą rzeczą do zrobienia jest to:

$str = 'TRUE';

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

var_dump($boolean);

Robiąc to w ten sposób, możesz zapętlić serię 'true', 'TRUE', 'false' lub 'FALSE' i uzyskać wartość łańcucha do wartości logicznej.

 4
Author: Brandon Sanders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-19 03:07:26

Inne odpowiedzi są zbyt skomplikowane. To pytanie jest po prostu logiczne pytanie. Po prostu popraw swoje zeznanie.

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

Teraz Twoja odpowiedź będzie albo

  • false, jeśli łańcuch był 'false',
  • lub true, Jeśli twój ciąg był 'true'.

Muszę zauważyć, że filter_var( $boolString, FILTER_VALIDATE_BOOLEAN ); nadal będzie lepszą opcją Jeśli musisz mieć ciągi takie jak on/yes/1 jako alias dla true.

 3
Author: kaiser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-04 13:20:15
function stringToBool($string){
    return ( mb_strtoupper( trim( $string)) === mb_strtoupper ("true")) ? TRUE : FALSE;
}

Lub

function stringToBool($string) {
    return filter_var($string, FILTER_VALIDATE_BOOLEAN);
}
 3
Author: DevellMen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-20 14:24:01

Możesz również użyć metody settype!

SetType ($var, " Boolean") Echo $var / / see 0 or 1

 2
Author: Nai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-11 09:56:56

Robię to w sposób, który rzuci każdą niewrażliwą na wielkość liter wersję łańcucha" false " do boolean FALSE, ale będzie zachowywać się przy użyciu normalnych reguł odlewania php dla wszystkich innych łańcuchów. Myślę, że to najlepszy sposób, aby zapobiec nieoczekiwanym zachowaniom.

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

Lub jako funkcja:

function safeBool($test_var){
    $test_var = strtolower(trim($test_var)) == 'false' ? FALSE : $test_var;
    return (boolean) $test_var;
}
 2
Author: Syntax Error,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-24 18:12:25

Odpowiedź przez @ GordonM jest dobra. Ale nie powiedzie się, jeśli $string jest już true (tzn. łańcuch nie jest łańcuchem, ale logicznym TRUE)...co wydaje się nielogiczne.

Rozszerzając jego odpowiedź, użyłbym:

$test_mode_mail = ($string === 'true' OR $string === true));
 2
Author: Ema4rl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-18 17:03:27

Jeśli zmienna "boolean" pochodzi z globalnej tablicy, takiej jak $_POST i $_GET, możesz użyć funkcji filtra filter_input().

Przykład postu:

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

Jeśli zmienna "boolean" pochodzi z innego źródła, możesz użyć funkcji filtra filter_var().

Przykład:

filter_var('true', FILTER_VALIDATE_BOOLEAN); // true
 1
Author: SandroMarques,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-23 09:03:57

Możesz użyć boolval($strValue)

Przykłady:

<?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";
?>

Dokumentacja http://php.net/manual/es/function.boolval.php

 1
Author: anayarojo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-10 19:08:26

Strval zrobi to i więcej.

Zobacz dokumenty. http://php.net/manual/en/function.strval.php

  $my_istrue = true;
  echo 'hi '.strval($my_istrue); // returns "hi 1"
 0
Author: JSG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-29 22:12:39

Byłem mylony z atrybutami wordpress shortcode, postanowiłem napisać niestandardową funkcję do obsługi wszystkich możliwości. może komuś się przyda:

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
Author: tomi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-13 05:34:49

Prostym sposobem jest sprawdzenie tablicy wartości, które uważasz za prawdziwe.

$wannabebool = "false";
$isTrue = ["true",1,"yes","ok","wahr"];
$bool = in_array(strtolower($wannabebool),$isTrue);
 0
Author: Tajin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 14:20:21

Powinieneś być w stanie rzucić do boolean za pomocą (bool), ale nie jestem pewien, bez sprawdzenia, czy to działa na ciągach "true" I "false".

To może być warte pop though

$myBool = (bool)"False"; 

if ($myBool) {
    //do something
}

Warto wiedzieć, że po umieszczeniu wewnątrz

if()
  • sam boolean FALSE
  • liczba całkowita 0 (zero)
  • float 0.0 (zero)
  • pusty łańcuch, oraz łańcuch " 0 "
  • tablica z zerem elements
  • obiekt z zerowymi zmiennymi członkowskimi (tylko PHP 4)
  • specjalny typ NULL (zawierający zmienne unset)
  • Obiekty SimpleXML utworzone z pustych tagów

Everytyhing else będzie oceniać na true.

Jak tu: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

 -3
Author: dougajmcdonald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-07 16:05:20