PHPで歯抜け、バラバラになった配列のキーを連番にする方法

2012.03.26.月
PHP技術

こんにちは、沼田です。
今回はPHPネタを投稿します。

ここしばらくは開発上、JavaScriptフレームワークのjQueryや、そのプラグインを用いることが多いです。

jQueryプラグインの方でAjax通信を使って、PHPサーバからJSON化したデータを取得するケースがありますが、PHPサーバ側で配列データをJSON化して出力する時は、気をつけないと意図した結果と異なりjQueryプラグイン側でエラーになってしまいます。

まずは、以下のPHP配列をご覧ください。

■配列1

array(3) {
[1] => string(5) "data1"
[3] => string(5) "data2"
[9] => string(5) "data3"
}


これをjson_encode()を使ってJSON形式にエンコードします。
すると以下のようなエンコード結果が得られます

{"1":"data1","3":"data2","9":"data3"}



では、次のような配列はどうでしょう。

■配列2

array(3) {
[0] => string(5) "data1"
[1] => string(5) "data2"
[2] => string(5) "data3"
}


これをjson_encode()を使ってJSON形式にエンコードします。
すると以下のようなエンコード結果が得られます

["data1","data2","data3"]



配列1の時と配列2の時で、出力結果が違いますね。

2つのPHP配列の違いは一見して無いように見えますが、よく見ると以下のような違いがあります。
  • 配列1・・・・・キーが連番でない
  • 配列2・・・・・キーが連番である

jQueryプラグインによっては、配列1のようにキーが連番ではない配列をJSON化したデータを受け取ると、エラーになってしまうものがあります。

あらかじめ、PHP配列のキーが連番になるようにすれば済む話ですが、処理の途中で配列の一部のキーを削除したい時もあるかと思います。

そういった場合に、ループでキーを振りなおすのは面倒です。






前置きが長くなりましたが、そこでキーが歯抜け、バラバラになった配列を連番にする方法の出番です。




array_merge()は通常、複数の配列をマージする目的で使用されるケースが多いと思います。
ですが、array_merge()関数の引数に、キーが歯抜けになっている配列1のような配列を指定してあげることで、配列2のようなキーが連番になった配列に変換することができます。

実行例)

< ?php
$data = array(
1 => "data1",
3 => "data2",
9 => "data3"
);
$data = array_merge($data);
?>



上記実行例の$dataをvar_dump()した時の出力結果は以下のようになり、キーが連番になっていることが分かります。

array(3) {
  [0] => string(5) "data1"
  [1] => string(5) "data2"
  [2] => string(5) "data3"
}


また、$dataをjson_encode()を使ってJSON形式にエンコードすると、以下のようなエンコード結果が得られます。
["data1","data2","data3"]


是非お試しください。