PHPで配列からインデックスなしのカッコでクエリ文字列を作りたい

こんにちは、さるまりんです。

こんな配列があります。

$arr = [
    'fruits' => ['apple', 'orange', 'banana']
];

fruitsappleorangebananaと3つの値が入ってます。

これをPHPのhttp_build_query()に渡すとこんな文字列を返します。

fruits%5B0%5D=apple&fruits%5B1%5D=orange&fruits%5B2%5D=banana

これを↓のようにしたい。

fruits[]=apple&fruits[]=orange&fruits[]=banana

具体的にいうとインデックスの数字なしの角かっこのパラメタ名にしたいということです。

preg_replace()を使って置き換えます。

preg_replace('/\%5B\d+\%5D/', '[]', http_build_query($arr));

fruits[]=apple&fruits[]=orange&fruits[]=banana

やっているのは%5B[%5D]にして、インデックスの数字をなくしているだけです。

渡す元のデータに[]が入っていたらどうでしょうか?

$arr = [
    'names' => ['panic[wow]star', 'single[red]beam']
];

これを処理するとこうなります。

names[]=panic%5Bwow%5Dstar&names[]=single%5Bred%5Dbeam

文字列の中だけエンコードされていますね。

今度は名前やデータに%5B%5Dが含まれていたらどうでしょうか?

$arr = [
    '%5B%5D' => ['What is going to happen to %5B and %5D']
];

↑だと↓になります。

%255B%255D[]=What+is+going+to+happen+to+%255B+and+%255D

%%25に変換されているので、内容が失われてしまうことはなさそうです。

%5B%5Dのままでもいいこともあるのでしょうが、今回はどうしても[]にして欲しいというリクエストがあったので色々試してみました。
小さいことですが要求に応えるのは大事なことがありますね。

読んでくださってありがとうございました。

それではまた!