Hoje eu estava brincando com o PHP e descobri que os valores da string "true" e "false" não são analisados corretamente como booleanos em uma condição, por exemplo, considerando a seguinte função:
function isBoolean($value) {
if ($value) {
return true;
} else {
return false;
}
}
Se eu executar:
isBoolean("true") // Returns true
isBoolean("") // Returns false
isBoolean("false") // Returns true, instead of false
isBoolean("asd") // Returns true, instead of false
Apenas parece funcionar com os valores "1" e "0":
isBoolean("1") // Returns true
isBoolean("0") // Returns false
Existe uma função nativa no PHP para analisar as seqüências de caracteres "true" e "false" em booleano?
isBoolean("")
deve retornar false.true
o leitor humano, mesmo que pareça mais intuitivoFALSE
.Respostas:
Existe um método PHP nativo de fazer isso que usa o método filter_var do PHP:
De acordo com o manual do PHP :
fonte
FILTER_NULL_ON_FAILURE
àfilter_var()
função e NÃO substituí-laFILTER_VALIDATE_BOOLEAN
como eu pensava. Isso resultará no seguinte código, que fez o truque para mim:$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
O motivo é que todas as strings são avaliadas ao
true
convertê-las em booleanas, exceto"0"
e""
(string vazia).A função a seguir fará exatamente o que você deseja: se comporta exatamente como o PHP, mas também avalia a string
"false"
comofalse
:A documentação explica que: http://php.net/manual/en/language.types.boolean.php :
fonte
Somente no PHP
"0"
ou a string vazia é coerente com false; todas as outras strings não vazias são coercitivas para true. Do manual :Você precisa escrever sua própria função para lidar com as cordas
"true"
vs"false"
. Aqui, suponho que todo o resto padrão seja false:Em uma nota lateral que poderia ser facilmente condensada para
fonte
Recentemente, eu precisava de uma função de conversão booleana "solta" para lidar com strings como as que você está perguntando (entre outras coisas). Encontrei algumas abordagens diferentes e criei um grande conjunto de dados de teste para executá-las . Nada se encaixava perfeitamente nas minhas necessidades, então escrevi as minhas:
Observe que, para objetos contáveis e combináveis por sequência, isso favorecerá a contagem sobre o valor da sequência para determinar a veracidade. Ou seja, se
$object instanceof Countable
isso retornar,(boolean) count($object)
independentemente do valor de(string) $object
.Você pode ver o comportamento dos dados de teste que usei, bem como os resultados de várias outras funções aqui . É meio difícil analisar os resultados desse pequeno iframe, para que você possa visualizar a saída do script em uma página inteira (esse URL não é documentado, portanto isso pode não funcionar para sempre). Caso esses links morram algum dia, eu coloco o código em pastebin .
A linha entre o que "deveria ser verdade" e o que não deveria é bastante arbitrária; os dados que usei são classificados com base em minhas necessidades e preferências estéticas; as suas podem diferir.
fonte
Estou usando essa construção para transformar cadeias de caracteres em booleanos, pois você deseja
true
a maioria dos outros valores:fonte
Não - ambos são strings, e os dois (como você diz) avaliam
true
. Somente cadeias vazias são avaliadas parafalse
no PHP.Você precisaria testar isso manualmente. Se possível, seria melhor trabalhar com valores booleanos "reais".
fonte
true
em PHP.true
]" pode dar a um novato a impressão errada, especialmente uma de outro idioma com regras de digitação mais rigorosas, em que uma string é uma string e o conteúdo não importa quando está sendo convertido em um booleano (como Rubi)."0"
? Isso também não avaliafalse
?A maneira mais fácil de converter com segurança para um booleano;
fonte
Se sua API aceitar apenas as strings "true" ou "false", com todo o resto se tornando
null
, tente:Isso pressupõe que
$input
não é um objeto. Null coalesce (??
) foi introduzido no PHP 7.0.fonte