web-dev-qa-db-ja.com

クエリ文字列内で配列を渡す方法

クエリ文字列を通して配列を渡す標準的な方法はありますか?

明確にするために、複数の値を持つクエリ文字列があり、そのうちの1つが配列値になります。そのクエリ文字列値を配列として扱いたい - 他のクエリ文字列変数と区別がつかないように配列を分解したくない。

また、この post answer によると、作者は配列に対するクエリ文字列のサポートは定義されていないと示唆しています。これは正確ですか?

編集:

@ Alexの答えに基づくと、これを行うための標準的な方法はないので、私のフォローアップは認識への簡単な方法であり、私が読んでいるパラメータは両方の配列ですPHPJavascript

複数のパラメータに同じ名前を付けてもかまいません。そうすれば、それらが配列に属していることがわかります。例:

?myarray=value1&myarray=value2&myarray=value3...

それとも悪い習慣でしょうか。

298
Yarin

これが私が考え出したものです:

標準が必ずしも規定されているわけではないので、複数値フォームフィールドの送信、すなわちGET/POST変数による配列の送信は、いくつかの異なる方法で行うことができます。

複数値フィールドまたは配列を送信する3つの方法は次のとおりです。

  • ?cars[]=Saab&cars[]=Audi(最善 - PHPはこれを配列に読み込みます)
  • ?cars=Saab&cars=Audi(悪い方法 - PHPは最後の値のみを登録します)
  • ?cars=Saab,Audi(これを試していない)

フォーム例

フォームでは、多値フィールドは、 選択ボックスを複数の に設定した形式をとることができます。

<form> 
    <select multiple="multiple" name="cars[]"> 
        <option>Volvo</option> 
        <option>Saab</option> 
        <option>Mercedes</option> 
    </select>
</form>

(注:この場合、結果の要求varsがPHPによって配列として登録されるように、選択コントロールにsome_name[]という名前を付けることが重要です。

...または 同じ名前の複数の隠しフィールド

<input type="hidden" name="cars[]" value="Volvo">
<input type="hidden" name="cars[]" value="Saab">
<input type="hidden" name="cars[]" value="Mercedes">

注: 複数の値にfield[]を使用することはあまり文書化されていません。 クエリ文字列 - Wikipedia 、または W3Cドキュメント /複数選択入力を扱う/の中の多値キーに関するセクションには、このことについては何も言及されていません。


_ update _

コメント者が指摘したように、これは非常にフレームワーク固有のものです。いくつかの例:

クエリ文字列:

?list_a=1&list_a=2&list_a=3&list_b[]=1&list_b[]=2&list_b[]=3&list_c=1,2,3

レール:

"list_a": "3", 
"list_b":[
    "1",
    "2",
    "3"
  ], 
"list_c": "1,2,3"

角度:

 "list_a": [
    "1",
    "2",
    "3"
  ],
  "list_b[]": [
    "1",
    "2",
    "3"
  ],
  "list_c": "1,2,3"

(Angular ディスカッション

node.js Wordpress ASP.net の例については、コメントを参照してください。


順序を維持する: あなたがあなたのアイテムのorderを維持する必要があるなら(つまり、順序付きリストとしての配列)、本当に1つのオプションしかないということです区切られた値のリストを渡し、それを自分で配列に明示的に変換する。

365
Yarin

クエリ文字列はテキストデータを運ぶので、配列を分解し、それを正しくエンコードし、あなたが選んだ表現形式で渡すしかありません。

p1=value1&pN=valueN...
data=[value1,...,valueN]
data={p1:value1,...,pN:valueN}

そしてそれをあなたのサーバサイドコードでデコードします。

34
Alex K.

標準があるとは思わない。
各Web環境は、そのようなことに対して独自の「標準」を提供します。その上、URLは通常何にも短すぎます(ブラウザによっては256バイト制限)。もちろん、より長い配列/データはPOSTリクエストで送信できます。

ただし、いくつかの方法があります。

  1. URLクエリで角括弧([])を使用するPHP方法があります。例えば、?array_name[]=item&array_name[]=item_2のような問い合わせは文書化されていないにもかかわらず、PHPが自動的にそれを配列に変換することでうまくいくと言われています。ソース: https://stackoverflow.com/a/9547490/3787376

  2. オブジェクトデータ交換フォーマット(例えば、JSON - 公式WebサイトPHP documentation )も、JSONのように文字列との間で変数を変換する方法がある場合に使用できます。
    また、HTTP getリクエストには文字列データを正しくエンコードするためのurl-encoder(ほとんどのプログラミング言語で利用可能)が必要です。

「角括弧法」は単純で効果的ですが、PHPと配列に限られています。
クラスやPHP以外の言語でクエリ文字列内に変数を渡すなど、他の種類の変数が必要な場合は、JSONメソッドをお勧めします。

JSONメソッドのPHPの例(方法2):

$myarray = array(2, 46, 34, "dfg");
$serialized = json_encode($myarray)
$data = 'myarray=' . rawurlencode($serialized);
// Send to page via cURL, header() or other service.

ページを受け取るためのコード(PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.
17
Berry Tsakala

クエリ文字列で配列をサーブレットに渡すことを探している人には便利だと思います。私は以下のクエリ文字列をテストし、req.getgetParameterValues()を使って配列値を取得することができました。方法。下記は私がブラウザを介して渡したクエリ文字列です。

  http://localhost:8080/ServletsTutorials/*.html? 
  myname=abc&initial=xyz&checkbox=a&checkbox=b

チェックボックスはここの私のパラメータ配列です。

7
vara

質問にはPHPとJavascriptを記載していますが、タグには記載していません。私はMVC.Netアクションに配列を渡すことを意図してこの質問に答えました。

私は私の質問に対する答えを見つけました ここ :あなたがあなたの質問で提案したものであり、同じ名前を持つ複数のパラメータがあります。

2
DCShannon

これは私のために働く:

リンクにおいて、to属性はvalue-> を持つ

to =“/filter/arr?fruits =アップルとフルーツ=バナナ”

ルートはこれを処理できます - >

path = "/ filter /:arr"

複数の配列の場合

to =“ filter/arr?fruits =リンゴと果物=バナナと野菜=ポテトと野菜=タマネギ "

ルートは変わりません。

_スクリーンショット_

enter image description here

1
alia

http_build_query を使用すると、PHPの配列からURLエンコードされたクエリ文字列を生成できます。結果のクエリ文字列は展開されますが、http_build_queryメソッドのパラメータとして必要な一意の区切り文字を決定できます。そのため、デコードに関しては、使用された区切り文字を確認できます。もしそれがあなたが選んだユニークなものであれば、それは配列クエリ文字列になるでしょう。そうでなければそれは通常のクエリ文字列になるでしょう。

1
keyboardP

parse_string関数をチェックしてください http://php.net/manual/en/function.parse-str.php

配列を含むクエリ文字列からすべての変数を返します。

Php.netからの例:

<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz

parse_str($str, $output);
echo $output['first'];  // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz

?>
0
Dan Murfitt