PHPで連想配列をファイルにダンプしたい。結果が空になることもあります。この場合、すべてのファイルを同じ方法で処理できるように、ファイルの内容を正確に : { } にする必要があります。ただし、php では単純な配列しか初期化できないため、ファイルの出力は常に次のようになります: [ ]. 連想配列にダミーエントリを追加してから、エントリを再度削除して配列を空にしようとしましたが、再び [ ] がファイル内の出力になります。
4 に答える
このjson_encode
関数には、文脈上適切な場合に配列をオブジェクトに変換するオプションがあります。つまり、連想配列ですが、これには空の配列も含まれます。次に例を示します。
$array = array(
'foo' => array(),
'bar' => array()
);
echo json_encode($array, JSON_FORCE_OBJECT); // {"foo":{},"bar":{}}
エンコードする前にオブジェクトにキャストします。
json_encode((object) $array);
これに対する別の答えは、変数を初期化するときにArrayObject
代わりに使用することです。[]
以下に問題を示します。連想配列が空の場合、次のようにエンコードされた JSON になります'[]'
。
$object = [];
echo json_encode($object); // you get '[]'
$object['hello'] = 'world';
echo json_encode($object); // you get '{hello: "world"}'
代わりに、すべてを同じに保ちますが、 を宣言するときは、次$object
を使用しますArrayObject
。
$object = new ArrayObject;
echo json_encode($object); // you get '{}'
$object['hello'] = 'world';
echo json_encode($object); // you get '{hello: "world"}'
これが良い代替手段である理由は、 using(object) []
が変数を stdClass に変換するためです。つまり、 を使用してプロパティにアクセスする必要があります$variable->property
。ただし、すべての既存のコードが を使用して記述されている場合、代わりに を使用できるのに$variable['property']
、 を使用(object) []
するとそのコードをすべて変更する必要がありますnew ArrayObject
。
PHP5 から利用可能になったArrayObjectへのリンク
配列が空かどうかを確認する必要があります。
if (empty($array_to_dump)) {
print ':{}';
} else {
print serialize($array_to_dump);
}
ただし、シリアル化を解除したときに返される配列は、どちらの方法でもまったく同じでなければなりません...空の配列です。
編集:または上記を使用すると、さらに効果的です。