記事一覧はこちら

phpで値をシリアル化するのに使える関数が無い

この記事では、phpに置いて変数をテキストファイルとして保存する場合の調査を行います。
phpには三種類のシリアル化関数があります。json_encode(); serialize(); var_export();この三種類の関数に以下の変数を与えます。

 
$arr[]=["english"=>"abcde"];//アルファベットそのまま 
$arr[]=["return_n"=>"anb"];//改行コード ¥n 
$arr[]=["return_r"=>"arb"];//改行コード ¥r 
$arr[]=["return_rn"=>"arnb"];//改行コード ¥r¥n 
$arr[]=["tab"=>"atb"];//タブ文字 ¥t 
$arr[]=["sign"=>"! #$%&'()*+,-./:;?@[]^_{|}~"];//半角記号 
$arr[]=["backSlash"=>"\"];//円記号又はバックスラッシュ 
$arr[]=["doubleQuarto"=>"""];//ダブルクオーテーション 
$arr[]=["jap"=>"あいうえお"];//日本語 

そして三種類の関数の戻り値(出力)です

 
[{"english":"abcde"},{"return_n":"anb"},{"return_r":"arb"},{"return_rn":"arnb"},{"tab":"atb"},{"sign":"! #$%&'()*+,-./:;?@[]^_{|}~"},{"backSlash":"\"},{"doubleQuarto":"""},{"jap":"u3042u3044u3046u3048u304a"}] 
a:9:{i:0;a:1:{s:7:"english";s:5:"abcde";}i:1;a:1:{s:8:"return_n";s:3:"a 
b";}i:2;a:1:{s:8:"return_r";s:3:"a 
b";}i:3;a:1:{s:9:"return_rn";s:4:"a

b";}i:4;a:1:{s:3:"tab";s:3:"a b";}i:5;a:1:{s:4:"sign";s:31:"! #$%&'()*+,-./:;?@[]^_{|}~";}i:6;a:1:{s:9:"backSlash";s:1:"";}i:7;a:1:{s:12:"doubleQuarto";s:1:""";}i:8;a:1:{s:3:"jap";s:15:"あいうえお";}}

array ( 
  0 => 
  array ( 
    'english' => 'abcde', 
  ), 
  1 => 
  array ( 
    'return_n' => 'a 
b', 
  ), 
  2 => 
  array ( 
    'return_r' => 'a 
b', 
  ), 
  3 => 
  array ( 
    'return_rn' => 'a

b', ), 4 => array ( 'tab' => 'a b', ), 5 => array ( 'sign' => '! #$%&'()*+,-./:;?@[]^_{|}~', ), 6 => array ( 'backSlash' => '\', ), 7 => array ( 'doubleQuarto' => '"', ), 8 => array ( 'jap' => 'あいうえお', ), )

結果を纏めます。

json_encode() serialize() var_export()
日本語はそのままか いいえ はい はい
制御文字はエスケープされているか はい いいえ いいえ
値を書き換えるだけで復元できるか はい いいえ はい

日本語はそのままか というのは、日本語がu3042の様に変換されているかという事です。変換されていると読みにくいです。
制御文字はエスケープされているか というのは、特に改行がnの様に変換されているかという事です。変換されていて、シリアル化した値を一行で管理出来るかという事です。
値を書き換えるだけで復元できるか というのは、serializeは値を書き換える時にバイト数も書き換えないとエラーになりました。

この様に、全ての条件を満たす関数は無いようです。
最初から一行で出力してくれるjson_encodeが日本語をそのまま出力してくれたら一番なのですが。