0
0

More than 3 years have passed since last update.

[PHP] json_encode の第2引数を整数で指定する

Posted at

値をJSON形式にして返す関数が json_encode です。
第2引数にエンコードのオプションを指定できます。

結論

定数と整数,どちらで指定しても同じです。
以下が対応表になります。参考

JSON_HEX_TAG => 1
JSON_HEX_AMP => 2
JSON_HEX_APOS => 4
JSON_HEX_QUOT => 8
JSON_FORCE_OBJECT => 16
JSON_NUMERIC_CHECK => 32
JSON_UNESCAPED_SLASHES => 64
JSON_PRETTY_PRINT => 128
JSON_UNESCAPED_UNICODE => 256

JSON_ERROR_DEPTH => 1
JSON_ERROR_STATE_MISMATCH => 2
JSON_ERROR_CTRL_CHAR => 3

JSON_ERROR_SYNTAX => 4

JSON_ERROR_UTF8 => 5
JSON_OBJECT_AS_ARRAY => 1

JSON_BIGINT_AS_STRING => 2

つまり以下の2つは全く同じです。

$arr = ['a' => "<p>hello</p>"];

echo json_encode($arr, JSON_HEX_TAG); // {"a":"\u003Cp\u003Ehello\u003C\/p\u003E"}
echo json_encode($arr, 1); // {"a":"\u003Cp\u003Ehello\u003C\/p\u003E"}

解説

公式ドキュメントでは以下のように定義されています。

json_encode (mixed $value, int $flags = 0, int $depth = 512) : string|false

オプション引数を指定しない場合

$arr = ['a' => 1, 'b' => 'hello'];
echo json_encode($arr); // {"a":1,"b":"hello"}

php-src を追ってみる

この部分で定数が定義されています。

/* json_encode() options */
#define PHP_JSON_HEX_TAG                    (1<<0)
#define PHP_JSON_HEX_AMP                    (1<<1)
#define PHP_JSON_HEX_APOS                   (1<<2)
#define PHP_JSON_HEX_QUOT                   (1<<3)
#define PHP_JSON_FORCE_OBJECT               (1<<4)
#define PHP_JSON_NUMERIC_CHECK              (1<<5)
#define PHP_JSON_UNESCAPED_SLASHES          (1<<6)
#define PHP_JSON_PRETTY_PRINT               (1<<7)
#define PHP_JSON_UNESCAPED_UNICODE          (1<<8)
#define PHP_JSON_PARTIAL_OUTPUT_ON_ERROR    (1<<9)
#define PHP_JSON_PRESERVE_ZERO_FRACTION     (1<<10)
#define PHP_JSON_UNESCAPED_LINE_TERMINATORS (1<<11)

/* json_decode() and json_encode() common options */
#define PHP_JSON_INVALID_UTF8_IGNORE        (1<<20)
#define PHP_JSON_INVALID_UTF8_SUBSTITUTE    (1<<21)
#define PHP_JSON_THROW_ON_ERROR             (1<<22)

1つ見てみましょう。

#define PHP_JSON_UNESCAPED_UNICODE          (1<<8)

PHP_JSON_UNESCAPED_UNICODE という名前の定数を,256 という値で定義しています。

1<<8 というのはシフト演算です。1を8ビットだけ左にシフトするという意味です。要は,1を左に8桁シフトしているだけです。
10進数の 256 は,2進数だと 100000000 です。末尾に0が8個ついていますね。

ちなみに,json_encode の実装は この部分です。

最後に

今回は知らないと困るような内容ではないですが,気になったので調べてみました。
何か間違いなどあればご指摘いただければ幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0