Jak przekonwertować ciąg na logiczny php

318

Jak mogę przekonwertować ciąg boolean?

$string = 'false';

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

var_dump($test_mode_mail);

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

powraca

boolean true

ale powinno być boolean false.

laukok
źródło
Dlaczego ktoś odpowiedział na temat $ bool = !! $ string1?
zloctb
1
@zloctb, ponieważ nie odpowiada na pytanie. !!$string1zwróci wartość logiczną wskazującą na ciąg przedstawiony w odpowiedzi najwyżej ocenianej.
David Barker,

Odpowiedzi:

347

Ciągi zawsze mają wartość logiczną true, chyba że mają wartość, którą PHP uważa za „pustą” (wziętą z dokumentacji dlaempty ):

  1. "" (pusty ciąg);
  2. "0" (0 jako ciąg)

Jeśli musisz ustawić wartość logiczną na podstawie wartości tekstowej ciągu, musisz sprawdzić obecność tej wartości lub jej brak.

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

EDYCJA: powyższy kod ma na celu wyjaśnienie. W rzeczywistości bardziej odpowiedni może być następujący kod:

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

a może użycie filter_varfunkcji może obejmować więcej wartości boolowskich:

filter_var($string, FILTER_VALIDATE_BOOLEAN);

filter_varobejmuje cały zakres wartości, w tym wartości truthy "true", "1", "yes"i "on". Zobacz tutaj po więcej szczegółów.

GordonM
źródło
5
Polecam zawsze stosować ścisłe porównanie, jeśli nie jesteś pewien, co robisz:$string === 'true'
Znarkus,
248
Znalazłem to - filter_var($string, FILTER_VALIDATE_BOOLEAN);czy to dobrze?
laukok
10
Trójskładnik nie wydaje się konieczny. Dlaczego nie ustawić po prostu $ test_mode_mail na wartość nierówności? $ test_mode_mail = $ string === 'true'
Tim Banks
3
Ale co z 1/0, PRAWDA / FAŁSZ? Myślę, że odpowiedź @lauthiamkok jest najlepsza.
ryabenko-pro
1
@FelipeTadeo Mówię o tym, jak PHP ocenia łańcuchy w odniesieniu do operacji boolowskich, nigdy nie wspominałem o eval () i nigdy nie zalecałbym używania go w żadnych okolicznościach. Ciąg „(3 <5)” zostanie oceniony przez PHP jako boolean true, ponieważ nie jest pusty.
GordonM,
647

Ta metoda została opublikowana przez @lauthiamkok w komentarzach. Publikuję go 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 FILTER_VALIDATE_BOOLEANflagą.

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
Ćwiek
źródło
5
Zgodnie z dokumentacją ta funkcja jest dostępna dla PHP 5> = 5.2.0. php.net/manual/en/function.filter-var.php
Westy92
4
Naprawdę podoba mi się to rozwiązanie do ustawiania wartości logicznych opartych na atrybutach shortcode WordPress, które mają wartości takie jak true, false, on, 0 itd. Świetna odpowiedź, zdecydowanie powinna być odpowiedzią akceptowaną.
AndyWarren
11
filter_var($answer, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)działało dla mnie jeszcze lepiej. Zobacz php.net/manual/en/function.filter-var.php#121263
Ryan
!! Ważna uwaga !! filter_var zwraca również FAŁSZ, jeśli filtr zawiedzie. Może to powodować pewne problemy.
AFA z
35

Ciąg "false" jest faktycznie uważany "TRUE"przez PHP za wartość. Dokumentacja mówi:

Aby jawnie przekonwertować wartość na wartość logiczną, użyj rzutowań (bool) lub (boolean). Jednak w większości przypadków rzutowanie jest niepotrzebne, ponieważ wartość zostanie automatycznie przekonwertowana, jeśli operator, funkcja lub struktura kontrolna wymaga argumentu logicznego.

Zobacz także Type Juggling.

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

  • boolean FALSE

  • liczba całkowita 0 (zero)

  • liczba zmiennoprzecinkowa 0,0 (zero)

  • pusty ciąg i ciąg „0”

  • tablica z zerowymi elementami

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

  • specjalny typ NULL (w tym zmienne nieustawione)

  • Obiekty SimpleXML utworzone z pustych znaczników

Każda inna wartość jest uważana za PRAWDA (w tym każdy zasób).

więc jeśli to zrobisz:

$bool = (boolean)"False";

lub

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

w obu przypadkach $boolbędzie TRUE. Więc musisz to zrobić ręcznie, jak sugeruje GordonM.

wosis
źródło
1
Euhm, oczywiście dolna zwraca fałsz. W rzeczywistości generuje błąd krytyczny :) „Błąd krytyczny: tylko zmienne mogą być przekazywane przez referencję”. $ a = „False”; settype ($ a, 'boolean'); var_dump ($ a); rzeczywiście zwróci fałsz.
Rob
16

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

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

W powyższym kodzie moja wartość logiczna została przekonwertowana na ciąg JSON.

Aby temu zaradzić, możesz zdekodować ciąg za pomocą json_decode():

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

(Powinno to normalnie działać z wartościami logicznymi konwertowanymi na łańcuch i wysyłanymi do serwera również w inny sposób, np. Za pomocą JSON.)

Nishanth Shaan
źródło
11

możesz użyć json_decode, aby zdekodować ten boolean

$string = 'false';
$boolean = json_decode($string);
if($boolean) {
  // Do something
} else {
  //Do something else
}
souparno majumder
źródło
json_decode również przekształci się na liczbę całkowitą, jeśli podany ciąg jest liczbą całkowitą
Mihai Răducanu
1
Tak, to prawda, ale wspomniano, że ciąg ma wartość logiczną
souparno majumder
8
(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
mrded
źródło
Co z oni off?
Kod cyklonowy
7

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

Przykład dla testu POST:

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

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

Przykład:

filter_var('true', FILTER_VALIDATE_BOOLEAN); // true
SandroMarques
źródło
7

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

anayarojo
źródło
2
echo boolval('false');=> 1
Mubashar
Możesz użyć echo (int)'false;lubecho intval('false');
anayarojo
@anayarojo (int)'true'i intval('true')oba zwracają również 0 (wszystkie ciągi robią)
sketchyTech
4

najłatwiej jest to zrobić:

$str = 'TRUE';

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

var_dump($boolean);

Robiąc to w ten sposób, możesz przejść przez serię „prawda”, „PRAWDA”, „fałsz” lub „FAŁSZ” i uzyskać wartość ciągu na wartość logiczną.

Brandon Sanders
źródło
3

Inne odpowiedzi są zbyt skomplikowane. To pytanie jest po prostu logicznym pytaniem. Po prostu popraw swoje oświadczenie.

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

Teraz twoja odpowiedź będzie albo

  • false, jeśli ciąg 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 potrzebujesz ciągów takich on/yes/1jak alias true.

kajzer
źródło
3
function stringToBool($string){
    return ( mb_strtoupper( trim( $string)) === mb_strtoupper ("true")) ? TRUE : FALSE;
}

lub

function stringToBool($string) {
    return filter_var($string, FILTER_VALIDATE_BOOLEAN);
}
Dmitry
źródło
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

Musisz określić

FILTER_NULL_ON_FAILURE
w przeciwnym razie otrzymasz zawsze fałsz, nawet jeśli ciąg $ zawiera coś innego.

Yoben
źródło
2

Możesz także użyć metody settype!

SetType ($ var, „Boolean”) Echo $ var // patrz 0 lub 1

Nai
źródło
2

Robię to w sposób, który wyrzuci dowolną, bez rozróżniania wielkości liter, ciąg „false” na wartość logiczną FAŁSZ, ale zachowa się przy użyciu normalnych reguł rzutowania php dla wszystkich innych ciągów. Myślę, że to najlepszy sposób, aby zapobiec nieoczekiwanemu zachowaniu.

$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;
}
Błąd składni
źródło
2

Odpowiedź @GordonM jest dobra. Ale nie powiedzie się, jeśli $stringjest już true(tzn. Łańcuch nie jest łańcuchem, ale ma wartość logiczną PRAWDA) ... co wydaje się nielogiczne.

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

$test_mode_mail = ($string === 'true' OR $string === true));
Ema4rl
źródło
0

Byłem mylony z atrybutami shortcode wordpress, postanowiłem napisać niestandardową funkcję do obsługi wszystkich możliwości. może jest to przydatne dla kogoś:

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']);
tomi
źródło
1
szukałem przede wszystkim pomocy, ale nie znalazłem nic tak łatwego, jak się spodziewałem. dlatego napisałem własną funkcję. możesz go używać.
tomi,
-1

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);
Tajin
źródło
-1

Edytowane, aby pokazać możliwość nie wymienioną tutaj, ponieważ moja pierwotna odpowiedź daleka była od pytania dotyczącego PO.

preg_match (); Jest możliwe w użyciu. Jednak w większości aplikacji korzystanie z niego będzie znacznie trudniejsze niż w przypadku innych odpowiedzi tutaj.

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)/iMoże być również stosowany w razie potrzeby w niektórych sytuacjach. Nie zwróci poprawnie, gdy oceni ciąg zawierający zarówno „fałsz”, jak i „1”.

JSG
źródło
Nie o to pytano. Pytanie brzmi, jak przekonwertować ciąg znaków na wartość logiczną.
mrded
mrded: Źle odczytałem pytanie, które przepraszam. Więc w dobrej formie duchowej dodam kolejną nie wymienioną tutaj możliwość.
JSG
-1

W PHP możesz po prostu przekonwertować wartość na wartość logiczną, używając 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
źródło
-4

Powinieneś być w stanie rzutować na boolean przy użyciu (bool), ale nie jestem pewien bez sprawdzenia, czy to działa na ciągach „prawda” i „fałsz”.

Może to być warte popu

$myBool = (bool)"False"; 

if ($myBool) {
    //do something
}

Warto wiedzieć, że poniższe zostaną ocenione na wartość logiczną False po włożeniu do środka

if()
  • boolean FALSE
  • liczba całkowita 0 (zero)
  • liczba zmiennoprzecinkowa 0,0 (zero)
  • pusty ciąg i ciąg „0”
  • tablica z zerowymi elementami
  • obiekt z zerowymi zmiennymi składowymi (tylko PHP 4)
  • specjalny typ NULL (w tym zmienne nieustawione)
  • Obiekty SimpleXML utworzone z pustych znaczników

Wszystko inne oceni się jako prawdziwe.

Zgodnie z opisem tutaj: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

dougajmcdonald
źródło
6
W odpowiedzi na zgadywanie w pierwszym akapicie: użycie jawnej rzutowania na boolean zmieni się "false"na true.
Mark Amery
2
Spowoduje to wydrukowanie „true”$myBool = (bool)"False"; if ($myBool) { echo "true"; }
SSH
2
To źle, łańcuchy są oceniane jako prawdziwe, chyba że zawierają „” lub „0”.
Michael J. Calkins