連想配列や配列をクエリする。

予備知識

クエリで配列や連想配列を送りたい場合以下の形式でリクエストしてあける。以下のサンプルはURLエンコード前でつ。

// 1.配列ですよ
index.html?hoge[]=10&hoge[]=20
// 2.連想配列ですよ
index.html?hoge[foo]=foo&hoge[bar]=bar

上記1のクエリが来たら$_GETの中身は以下みたいな感じになっている。

array(1) {
  ["hoge"]=>
  array(2) {
    [0]=>
    string(2) "10"
    [1]=>
    string(2) "20"
  }
}
HTMLだとこんな感じ。
<form action="index.html">
   <input type="text" name="hoge[]" />
   <input type="text" name="hoge[]" />
   <input type="text" name="hoge[foo]" />
   <input type="text" name="hoge[bar]" />
   <input type="submit" value="クエリ送信" />
</form>

順番はどうでもいかったらhoge[]みたいにしてあげると送られた順番に配列に格納される。順番指定したかったらhoge[0]とか番号を指定してあげる。

PHPの配列やオブジェクトからクエリ文字列に

PHPの配列やオブジェクトからクエリ文字列にするにはhttp_build_queryが便利。これ使うと簡単に配列やオブジェクトをクエリ文字列にしてくれる。便利。

<?php
$array = array(
    'hoge' => array(0, 1)
);
// hoge%5B0%5D=10&hoge%5B1%5D=20 
echo http_build_query();
?>

その逆は?(クエリ→配列に)

クエリから配列や連想配列にするのってparse_strを利用する。

<?php
$array = array();
$str = "hoge%5B0%5D=10&hoge%5B1%5D=20";

parse_str($str, $array);
var_dump($array);
?>

でも…

PHPからクエリ送んないし(僕の場合)。$_GET/$_POST使うから関係ないや。JavaScriptでこれらの関数あると便利そう!parse_strでlocation.searchからクエリもらってきてJavaScriptで扱うとか…。XHRのリクエストのときにhttp_build_queryしてクエリ送信みたいな。

というわけで

できたてのparse_urlを公開。http_build_queryは気が向いたら...

function parse_str(s, o)
{
    var i, f, p, m, r = /\[(.*?)\]/g;
    s = decodeURI(s.toString()).replace(/\+/g,' ').split('&');

    function c(o, k, v, p)
    {
        var n, m = r.exec(p);

        if(m != null)
        {
            n = m[1];
            if(typeof(o[k]) == 'undefined'){ o[k] = []; };
            c(o[k], n || o[k].length.toString(), v, p);
            return;
        };

        o[k] = v;
    };

    for(i=0,f=s.length;i<f;i++)
    {
        p = s[i].split('='), m = p[0].indexOf('[');
        c(o || this, (0 <= m) ? p[0].slice(0, m) : p[0], decodeURIComponent(p[1]), p[0]);
    };
};

var str = "hoge%5B0%5D=10&hoge%5B1%5D=20";
parse_str(str);

alert(hoge); // 10, 20