使用 json_decode 时, false 的布尔值会变成空值。我使用的 json 字符串的值可以为空、false、1 或某个文本值,并且我只想使用具有值的字段,即使该值为 false。所以做的时候
$array = array();
foreach($obj as $key => $value){
if($value != ''){
$array[$key] = $value;
}
}
具有错误值的字段不会保存到 $array 中。有办法解决吗?
更新:执行 print_r($obj) 时,所有 false 值均为空。所以我不认为 != 是问题所在。如果我 print_r json 字符串空值是“null”,假值是“false”,但是当 print_r-ing json_decoded 对象时,两者都会变成空值。
你的虚假消失是因为
if($value != ''){
使用
if($value !== ''){
因为 php 中的 false 是空的并且你的验证 != 阻止 false 通过
将比较从
!=
更改为 !==
$array = array();
foreach($obj as $key => $value){
if($value !== ''){
$array[$key] = $value;
}
}
这个问题在 Google 中排名很高,因此值得分享一些事实以避免混淆:
尽管标题可能暗示,
json_decode()
没有能力将false
变成空字符串,甚至不是故意的。如果您在基于 JSON 的应用程序中遇到这种情况,则错误一定是在其他地方。
print_r() 不是检查布尔变量的可靠工具,因为它将所有内容转换为字符串,而 PHP 将布尔 false 转换为空字符串。使用 var_dump() 来代替。
$input = [true, false, ''];
print_r($input);
var_dump($input);
Array
(
[0] => 1
[1] =>
[2] =>
)
array(3) {
[0]=>
bool(true)
[1]=>
bool(false)
[2]=>
string(0) ""
}
PHP 有两个 ≠ 运算符:宽松 (
!=
) 和严格 (!==
)。前者将应用类型转换来决定值是否匹配,后者将在类型不同时拒绝相等。当您需要区分 null、false、空字符串、数字零和以零开头的字符串时,您特别希望避免使用松散运算符。