Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在JSON中使用1和0,而不是True和False_Php_Json_Casting_Boolean_Type Conversion - Fatal编程技术网

Php 在JSON中使用1和0,而不是True和False

Php 在JSON中使用1和0,而不是True和False,php,json,casting,boolean,type-conversion,Php,Json,Casting,Boolean,Type Conversion,在PHP中,我注意到如果我有一个数组,然后json_encode()它,布尔值就会转换为true和false。但是,我希望将它们分别转换为1和0 下面是一个例子: $data = Array("foo" => true, "bar" => false, "baz" => false, "biz" => true); print json_encode($data); 上述产出: {"foo":true,"bar":false,"baz":false,"biz":true

在PHP中,我注意到如果我有一个数组,然后
json_encode()
它,布尔值就会转换为
true
false
。但是,我希望将它们分别转换为
1
0

下面是一个例子:

$data = Array("foo" => true, "bar" => false, "baz" => false, "biz" => true);
print json_encode($data);
上述产出:

{"foo":true,"bar":false,"baz":false,"biz":true}
Original:
array(4) {
  ["foo"]=>
  bool(true)
  ["bar"]=>
  bool(false)
  ["baz"]=>
  bool(false)
  ["biz"]=>
  bool(true)
}
{"foo":true,"bar":false,"baz":false,"biz":true}

Processed:
array(4) {
  ["foo"]=>
  int(1)
  ["bar"]=>
  int(0)
  ["baz"]=>
  int(0)
  ["biz"]=>
  int(1)
}
{"foo":1,"bar":0,"baz":0,"biz":1}
但是,如果
true
false
分别为
1
0
,则我们可以使用较短的字符串,这将减少通过Internet传输的时间:

{"foo":1,"bar":0,"baz":0,"biz":1}

如何让PHP使用
1
0
而不是
true
false
对JSON进行编码

我明白了。在编码JSON之前,可以使用PHP中的
array\u walk
array\u walk\u recursive
函数将布尔值转换为整数。为此,我编写了一个函数:

function change_booleans_to_numbers(Array $data){
    // Note the order of arguments and the & in front of $value 
    function converter(&$value, $key){
        if(is_bool($value)){
            $value = ($value ? 1 : 0);
        }
    }
    array_walk_recursive($data, 'converter');
    return $data;
}
下面是一个演示脚本:

<?php
// Make the browser display this as plain text instead of HTML 
header("Content-Type:text/plain");

function change_booleans_to_numbers(Array $data){
    function converter(&$value, $key){
        if(is_bool($value)){
            $value = ($value ? 1 : 0);
        }
    }
    array_walk_recursive($data, 'converter');
    return $data;
}

$data = Array("foo" => true, "bar" => false, "baz" => false, "biz" => true);

print "Original:" . PHP_EOL;
var_dump($data);
print json_encode($data) . PHP_EOL;
print PHP_EOL;

$changed = change_booleans_to_numbers($data);
print "Processed:" . PHP_EOL;
var_dump($changed);
print json_encode($changed) . PHP_EOL;

我强烈建议您尽可能在JSON消息中使用“true”和“false”(而不是“1”或“0”)。不这样做只会是拙劣的表现。恕我直言,我更关心的是下载JSON需要多长时间。如果你真的想用1/0而不是真/假来节省3个字节,那么你有99.9999%的几率会过早地进行优化。如果你不这样做,你就在从事可疑的微观优化。还有很多更重要的事情,比如数据库和文件系统访问,它们对性能的影响更大。你应该听听@paulsm4。我真的很难弄明白为什么你认为1992年后的web服务器提供的GZIP压缩无法处理由“true”而不是1添加的额外字节。您将bool表示为int,这是在错误地表示值的类型。哦,是的,我忘了我的web服务器启用了GZIP。