2

json_encode()PHP では、配列がある場合、ブール値がtrueandに変換されることに気付きましたfalse1ただし、それぞれとに変換したいと思います0

次に例を示します。

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

上記の出力:

{"foo":true,"bar":false,"baz":false,"biz":true}

ただし、truefalse1あり、0代わりに短い文字列を使用できる場合は、インターネット経由での転送にかかる時間が短くなります。

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

1and0の代わりにtrueandを使用して PHP で JSON をエンコードするにはどうすればよいfalseですか?

4

1 に答える 1

3

私はそれを考え出した。array_walkJSON をエンコードする前に、PHP でor関数を使用しarray_walk_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;

スクリプトは次を出力します。

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}
于 2012-08-18T22:48:19.917 に答える