Como converter string para php booleano

318

Como posso converter uma string para boolean?

$string = 'false';

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

var_dump($test_mode_mail);

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

retorna,

boolean true

mas deveria ser boolean false.

laukok
fonte
Por que alguém respondeu sobre $ bool = !! $ string1?
Zloctb 16/10
1
@zloctb porque não responde à pergunta. !!$string1retornaria um indicativo booleano da sequência descrita na resposta com melhor classificação.
David Barker

Respostas:

347

As strings sempre avaliam como boolean true, a menos que tenham um valor considerado "vazio" pelo PHP (extraído da documentação deempty ):

  1. "" (uma string vazia);
  2. "0" (0 como uma string)

Se você precisar definir um valor booleano com base no valor do texto de uma string, precisará verificar a presença ou não desse valor.

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

EDIT: o código acima destina-se à clareza de entendimento. No uso real, o código a seguir pode ser mais apropriado:

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

ou talvez o uso da filter_varfunção possa cobrir mais valores booleanos:

filter_var($string, FILTER_VALIDATE_BOOLEAN);

filter_varabrange toda uma gama de valores, incluindo os valores truthy "true", "1", "yes"e "on". Veja aqui para mais detalhes.

GordonM
fonte
5
Eu recomendo sempre usar uma comparação rigorosa, se você não tiver certeza do que está fazendo:$string === 'true'
Znarkus
248
Eu achei isso - filter_var($string, FILTER_VALIDATE_BOOLEAN);é uma coisa boa?
Laukok
10
O ternário não parece necessário. Por que não apenas definir $ test_mode_mail com o valor da desigualdade? $ test_mode_mail = $ string === 'true'
Tim Banks
3
Mas e quanto a 1/0, VERDADEIRO / FALSO? Acho que a resposta de @lauthiamkok é a melhor.
Ryabenko-pro
1
@FelipeTadeo Estou falando sobre como o PHP avalia cadeias de caracteres em relação às operações booleanas, nunca mencionei eval () e nunca recomendaria usá-lo em nenhuma circunstância. A string "(3 <5)" será avaliada pelo PHP como boolean true, porque não está vazia.
27713 GordonMay
648

Este método foi postado por @lauthiamkok nos comentários. Estou postando aqui como resposta para chamar mais atenção.

Dependendo das suas necessidades, considere usar filter_var()com a FILTER_VALIDATE_BOOLEANbandeira.

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
Brad
fonte
5
De acordo com a documentação, esta função está disponível para PHP 5> = 5.2.0. php.net/manual/en/function.filter-var.php
Westy92
4
Eu realmente gosto desta solução para definir booleanos com base em atributos de código de acesso do WordPress que tenham valores como true, false, on, 0, etc. Ótima resposta, definitivamente deve ser a resposta aceita.
AndyWarren
11
filter_var($answer, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)funcionou ainda melhor para mim. Veja php.net/manual/en/function.filter-var.php#121263
Ryan
!! Nota importante !! filter_var também retorna FALSE se o filtro falhar. Isso pode criar alguns problemas.
AFA Med
35

A String "false" é realmente considerada um "TRUE"valor pelo PHP. A documentação diz:

Para converter explicitamente um valor em booleano, use as conversões (bool) ou (boolean). No entanto, na maioria dos casos, a conversão é desnecessária, pois um valor será convertido automaticamente se um operador, função ou estrutura de controle exigir um argumento booleano.

Veja também Type Juggling.

Ao converter para booleano, os seguintes valores são considerados FALSE:

  • o próprio booleano FALSE

  • o número inteiro 0 (zero)

  • o flutuador 0,0 (zero)

  • a sequência vazia e a sequência "0"

  • uma matriz com zero elementos

  • um objeto com zero variáveis ​​de membro (somente PHP 4)

  • o tipo especial NULL (incluindo variáveis ​​não definidas)

  • Objetos SimpleXML criados a partir de tags vazias

Qualquer outro valor é considerado VERDADEIRO (incluindo qualquer recurso).

então se você fizer:

$bool = (boolean)"False";

ou

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

em ambos os casos $boolserá TRUE. Então você tem que fazer isso manualmente, como sugere GordonM.

wosis
fonte
1
Euhm, é claro que o inferior retorna falso. De fato, ele lança um fatal :) "Erro fatal: somente variáveis ​​podem ser passadas por referência". $ a = 'Falso'; settype ($ a, 'booleano'); var_dump ($ a); realmente retornará falso.
Rob
16

Ao trabalhar com JSON, tive que enviar um valor booleano via $_POST. Eu tive um problema semelhante quando fiz algo como:

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

No código acima, meu booleano foi convertido em uma string JSON.

Para superar isso, você pode decodificar a string usando json_decode():

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

(Normalmente, isso deve funcionar com valores booleanos convertidos em string e enviados ao servidor também por outros meios, ou seja, sem usar o JSON.)

Nishanth Shaan
fonte
11

você pode usar json_decode para decodificar esse booleano

$string = 'false';
$boolean = json_decode($string);
if($boolean) {
  // Do something
} else {
  //Do something else
}
souparno majumder
fonte
json_decode também irá transformar para inteiro, se a string dada é um inteiro
Mihai Răducanu
1
Sim, isso é verdade, mas a sua mencionou que a corda está segurando valor booleano
souparno Majumder
8
(boolean)json_decode(strtolower($string))

Ele lida com todas as variantes possíveis de $string

'true'  => true
'True'  => true
'1'     => true
'false' => false
'False' => false
'0'     => false
'foo'   => false
''      => false
mrded
fonte
Que tal one off?
Cyclonecode 21/03/19
7

Se sua variável "booleana" vier de uma matriz global como $ _POST e $ _GET, você poderá usar a filter_input()função de filtro.

Exemplo para POST:

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

Se sua variável "booleana" vier de outra fonte, você poderá usar a filter_var()função de filtro.

Exemplo:

filter_var('true', FILTER_VALIDATE_BOOLEAN); // true
SandroMarques
fonte
7

Você pode usar boolval($strValue)

Exemplos:

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

Documentação http://php.net/manual/es/function.boolval.php

anayarojo
fonte
2
echo boolval('false');=> 1
Mubashar
Você pode usar echo (int)'false;ouecho intval('false');
anayarojo
@anayarojo (int)'true'e intval('true')tanto de retorno 0, bem como (todas as cordas fazem)
sketchyTech
4

a coisa mais fácil a fazer é esta:

$str = 'TRUE';

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

var_dump($boolean);

Fazendo dessa maneira, você pode percorrer uma série de 'true', 'TRUE', 'false' ou 'FALSE' e obter o valor da string em um valor booleano.

Brandon Sanders
fonte
3

Outras respostas acabam complicando as coisas. Esta questão é simplesmente uma questão lógica . Apenas acerte sua afirmação.

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

Agora sua resposta será

  • false, se a sequência fosse 'false',
  • ou true, se sua string foi 'true'.

Devo observar que filter_var( $boolString, FILTER_VALIDATE_BOOLEAN );ainda será uma opção melhor se você precisar de strings como on/yes/1alias para true.

kaiser
fonte
3
function stringToBool($string){
    return ( mb_strtoupper( trim( $string)) === mb_strtoupper ("true")) ? TRUE : FALSE;
}

ou

function stringToBool($string) {
    return filter_var($string, FILTER_VALIDATE_BOOLEAN);
}
Dmitry
fonte
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

Você deve especificar

FILTER_NULL_ON_FAILURE
caso contrário, você sempre será falso, mesmo que $ string contenha outra coisa.

yoben
fonte
2

Você também pode usar o método settype!

SetType ($ var, "Boolean") Eco $ var // veja 0 ou 1

Nai
fonte
2

Eu faço isso de uma maneira que converterá qualquer versão que não diferencia maiúsculas de minúsculas da string "false" para o booleano FALSE, mas se comportará usando as regras normais de conversão de php para todas as outras strings. Eu acho que essa é a melhor maneira de evitar comportamentos inesperados.

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

Ou como uma função:

function safeBool($test_var){
    $test_var = strtolower(trim($test_var)) == 'false' ? FALSE : $test_var;
    return (boolean) $test_var;
}
Erro de sintaxe
fonte
2

A resposta de @GordonM é boa. Mas isso falharia se o $stringjá estiver true(isto é, a string não é uma string, mas booleana TRUE) ... o que parece ilógico.

Estendendo sua resposta, eu usaria:

$test_mode_mail = ($string === 'true' OR $string === true));
Ema4rl
fonte
0

Eu estava ficando confuso com os atributos shortcode do wordpress, decidi escrever uma função personalizada para lidar com todas as possibilidades. talvez seja útil para alguém:

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
fonte
1
Eu estava procurando ajuda em primeiro lugar, mas não encontrou nada tão fácil quanto eu esperava. por isso escrevi minha própria função. Sinta-se livre para usá-lo.
21416
-1

Uma maneira simples é verificar uma matriz de valores que você considera verdadeiros.

$wannabebool = "false";
$isTrue = ["true",1,"yes","ok","wahr"];
$bool = in_array(strtolower($wannabebool),$isTrue);
Tajin
fonte
-1

Editado para mostrar uma possibilidade não mencionada aqui, porque minha resposta original estava longe de estar relacionada à pergunta do OP.

preg_match (); É possível usar. No entanto, na maioria dos aplicativos, será muito mais pesado do que outras respostas aqui.

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)/iTambém pode ser usado se necessário em determinadas situações. Ele não retornará corretamente quando avaliar uma string contendo "false" e "1".

JSG
fonte
Não foi isso que foi perguntado. A questão é como converter uma string em booleano.
mrded
mrded: interpretei mal a pergunta que peço desculpas. Portanto, na boa forma espiritual, acrescentarei outra possibilidade não mencionada aqui.
JSG
-1

No PHP, você simplesmente pode converter um valor em um booleano usando 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
fonte
-4

Você deve conseguir converter para um booleano usando (bool), mas não tenho certeza sem verificar se isso funciona nas cadeias "true" e "false".

Isso pode valer um pop embora

$myBool = (bool)"False"; 

if ($myBool) {
    //do something
}

Vale a pena saber que o seguinte avaliará o booleano False quando colocado dentro

if()
  • o próprio booleano FALSE
  • o número inteiro 0 (zero)
  • o flutuador 0,0 (zero)
  • a sequência vazia e a sequência "0"
  • uma matriz com zero elementos
  • um objeto com zero variáveis ​​de membro (somente PHP 4)
  • o tipo especial NULL (incluindo variáveis ​​não definidas)
  • Objetos SimpleXML criados a partir de tags vazias

Todo o resto avaliará como verdadeiro.

Conforme descrito aqui: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

dougajmcdonald
fonte
6
Em resposta à suposição no seu primeiro parágrafo: o uso de uma conversão explícita para booleano será convertido "false"em true.
Mark Amery
2
Isto irá imprimir "true"$myBool = (bool)"False"; if ($myBool) { echo "true"; }
SSH Este
2
Isso está errado, as seqüências de caracteres são avaliadas como verdadeiras, a menos que contenham "" ou "0".
Michael J. Calkins