PHP
JSON

[PHP]オブジェクト配列のjsonをcsvに変換する

バージョン

PHP 5.2.1 (cli) (built: May 28 2007 19:31:00)

コード

json2csv.php
<?php
ini_set("memory_limit", "512M");
$str = file_get_contents("json.txt");
$json = json_decode($str, true);
$fp = STDOUT;
$columns = array();
foreach ($json as $fields) {
    if (empty($columns)){
        $columns = array_keys($fields);
        fputcsv($fp, $columns);
    }

    $contents = array();
    foreach($columns as $column) {
        $contents[] = isset($fields[$column]) ? $fields[$column] : "";
    }
    fputcsv($fp, $contents);
}

解説

json.txtに保存されたオブジェクト配列のjson形式文字列をすべてメモリに読み込んでcsvとして標準出力に出力します。

sample.json
[
  {"key1":"value1","key2":"value2"},
  {"key1":"value1","key2":"value2"}
]

ini_set("memory_limit", "512M");
memory_limitは扱いたいjsonの量によって変わるので適宜変更します。
障害対応で書いたソースコードのため、メモリのことは特に考えていません。
なので、あまりにも巨大なjsonは扱うことができません。

$fp = STDOUT;
調べたら上記のコードが出てきたので、初めてSTDOUTを指定しましたが、楽で良いですね。
軽いものならそのまま出しても良いし、実行時に出力先を変えられるし楽です。
php json2csv.php > result.csv

    if (empty($columns)){
        $columns = array_keys($fields);
        fputcsv($fp, $columns);
    }

上記のコードでは、1番目のobjectからヘッダー行を取得しています。
そこからマッピングして組み立てています。