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ą.
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ą.
!! 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.
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.)
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.
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.
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));
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ś:
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”.
!!$string1
zwróci wartość logiczną wskazującą na ciąg przedstawiony w odpowiedzi najwyżej ocenianej.Odpowiedzi:
Ciągi zawsze mają wartość logiczną true, chyba że mają wartość, którą PHP uważa za „pustą” (wziętą z dokumentacji dla
empty
):""
(pusty ciąg);"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.
EDYCJA: powyższy kod ma na celu wyjaśnienie. W rzeczywistości bardziej odpowiedni może być następujący kod:
a może użycie
filter_var
funkcji może obejmować więcej wartości boolowskich:filter_var
obejmuje cały zakres wartości, w tym wartości truthy"true"
,"1"
,"yes"
i"on"
. Zobacz tutaj po więcej szczegółów.źródło
$string === 'true'
filter_var($string, FILTER_VALIDATE_BOOLEAN);
czy to dobrze?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()
zFILTER_VALIDATE_BOOLEAN
flagą.źródło
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#121263Ciąg
"false"
jest faktycznie uważany"TRUE"
przez PHP za wartość. Dokumentacja mówi:więc jeśli to zrobisz:
lub
w obu przypadkach
$bool
będzieTRUE
. Więc musisz to zrobić ręcznie, jak sugeruje GordonM.źródło
Podczas pracy z JSON musiałem wysłać wartość logiczną przez
$_POST
. Miałem podobny problem, kiedy zrobiłem coś takiego: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()
:(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.)
źródło
możesz użyć json_decode, aby zdekodować ten boolean
źródło
Obsługuje wszystkie możliwe warianty
$string
źródło
on
ioff
?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:
Jeśli zmienna „boolean” pochodzi z innego źródła, możesz użyć
filter_var()
funkcji filtrowania.Przykład:
źródło
Możesz użyć
boolval($strValue)
Przykłady:
Dokumentacja http://php.net/manual/es/function.boolval.php
źródło
echo boolval('false');
=> 1echo (int)'false;
lubecho intval('false');
(int)'true'
iintval('true')
oba zwracają również 0 (wszystkie ciągi robią)najłatwiej jest to zrobić:
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ą.
źródło
Inne odpowiedzi są zbyt skomplikowane. To pytanie jest po prostu logicznym pytaniem. Po prostu popraw swoje oświadczenie.
Teraz twoja odpowiedź będzie albo
false
, jeśli ciąg był'false'
,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 takichon/yes/1
jak aliastrue
.źródło
lub
źródło
Musisz określić
w przeciwnym razie otrzymasz zawsze fałsz, nawet jeśli ciąg $ zawiera coś innego.źródło
Możesz także użyć metody settype!
SetType ($ var, „Boolean”) Echo $ var // patrz 0 lub 1
źródło
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.
Lub jako funkcja:
źródło
Odpowiedź @GordonM jest dobra. Ale nie powiedzie się, jeśli
$string
jest 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:
źródło
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ś:
źródło
Prostym sposobem jest sprawdzenie tablicy wartości, które uważasz za prawdziwe.
źródło
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.
/(?:true)|(?:1)/i
Moż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”.źródło
W PHP możesz po prostu przekonwertować wartość na wartość logiczną, używając double not operator (
!!
):źródło
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
Warto wiedzieć, że poniższe zostaną ocenione na wartość logiczną False po włożeniu do środka
Wszystko inne oceni się jako prawdziwe.
Zgodnie z opisem tutaj: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting
źródło
"false"
natrue
.$myBool = (bool)"False"; if ($myBool) { echo "true"; }