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


353

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

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

また、この投稿の回答によれば、著者は配列のクエリ文字列のサポートが定義されていないことを示唆しています。これは正確ですか?

編集:

@アレックスの答えに基づいて、これを行う標準的な方法はないので、私のフォローアップは、私が読んでいるパラメータがPHPJavascriptの両方の配列であることを認識する簡単な方法は何ですか?

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

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

それともこれは悪い習慣でしょうか?


どのフレームワークを使用していますか?一部のフレームワークには、配列をクエリ文字列に渡すのに役立つメソッドがあります。
keyboardP

@ keyboardP-ユースケースに応じてPHPおよびJavascript
Yarin

2
myarray = value1、value2、value3
Serodis

18
@seroids:コンマ、疑問符、等号、および印刷不可能な文字を渡さなければならない場合はどうなりますか?
Berry Tsakala

回答:


429

これが私が理解したことです:

多値フォームフィールドの送信、つまり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>

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

...または同じ名前の複数の非表示フィールドとして:

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

注:field[]複数の値にを使用することは、文書化が不十分です。クエリ文字列の多値キーに関するセクション-Wikipediaや、複数選択の入力を扱うW3Cのドキュメントには、そのような記述はありません。


更新

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

クエリ文字列:

?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"

(角度

node.jsWordpressASP.netの例のコメントを参照してください


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


3
この機能がWikiやW3Cなどの一般的なソースに記載されていない理由は、Webフレームワークでは一般的にサポートされていないためだと思います。PHPとRailsは自動的に複数の「key []」クエリパラメータを配列に変換すると思います。他の人はしません。
Carl G

3
nodejsクエリ文字列モジュールが使用する?cars=Saab&cars=Audiフォーム
SystemParadox

53
エクスプレス(のNode.js)において、両方?cars=Saab&cars=Audi?cars[]=Saab&cars[]=Audi配列になっう。ただし、?cars=Saab最終的には文字列になりますが、?cars[]=Saab要素が1つだけの配列です。
Trevor Dixon

5
このアプローチを使用してキーを設定できますか?そして、多次元配列はどうですか?
Qwerty、2014年

5
ASP.NET MVCが形式を読み取らないようです?cars[]=Saab&cars[]=Audi角かっこがないか、角かっこにインデックスが必要です/
Mr. Flibble

37

クエリ文字列にはテキストデータが含まれるため、配列を分解して正しくエンコードし、選択した表現形式で渡す以外に選択肢はありません。

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

サーバー側のコードでデコードします。


説明してくれてありがとう。私の改訂された質問を見ることができますか-キーに対してp1 ... pnを実行する必要がありますか、それとも複数のキーに 'p'という名前を付けることができますか?
Yarin

1
同じ名前を使用できます。stackoverflow.com/questions/2203430/…またはSerodisがコメントした最も明白な方法であるp = aa、bb、cc
Alex K.

JSON.stringifyおよびで非常に便利ですJSON.parse
charliebrownie 2016

1
単純で一般的な表現形式は、JSONです。PHPでは、json_encodethen rawurlencodejson_decode他のページを使用しています。
エドワード

20

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

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

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

  2. オブジェクトデータ交換形式(JSON- 公式ウェブサイトPHPドキュメントなど)も、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.

1
Express.jsは、4.13.4でテストされた角括弧表記もサポートしています。
Steve Kehlet 16

7

クエリ文字列の配列をサーブレットに渡そうとしている人に役立つと思います。以下のクエリ文字列をテストし、req.getgetParameterValues();を使用して配列値を取得することができました。方法。以下は、ブラウザを介して渡したクエリ文字列です。

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

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


5

これは私にとってはうまくいきます:

リンクでは、to属性に値があります:

to="/filter/arr?fruits=apple&fruits=banana"

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

path="/filter/:arr"

複数のアレイの場合:

to="filter/arr?fruits=apple&fruits=banana&vegetables=potato&vegetables=onion"

ルートは変わりません。

スクリーンショット

ここに画像の説明を入力してください


2

質問でPHPとJavascriptについて言及しているが、タグでは言及していない。配列をMVC.Netアクションに渡すつもりでこの質問に行きました。

私の質問への答えがここに見つかりました:予想される形式は、あなたが質問で提案したものであり、複数のパラメーターが同じ名前を持っています。


2
このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
Andrew

@Andrewリンクだけの答えではありません。「予想される形式は、質問で提案したものであり、複数のパラメーターに同じ名前が付いています。」
DCシャノン

2

ReactとRailsを使用しています。やった:

js

  let params = {
    filter_array: ['A', 'B', 'C']
  }

  ...

  //transform params in URI

  Object.keys(params).map(key => {
    if (Array.isArray(params[key])) {
      return params[key].map((value) => `${key}[]=${value}`).join('&')
    }
  }
  //filter_array[]=A&filter_array[]=B&filter_array[]=C

1

http_build_queryを使用して、PHPの配列からURLエンコードされたクエリ文字列を生成できます。結果のクエリ文字列は展開されますが、http_build_queryメソッドのパラメーターとして必要な一意のセパレーターを決定できるため、デコードに関しては、使用されたセパレーターを確認できます。選択した一意のクエリ文字列の場合は、配列のクエリ文字列となり、それ以外の場合は通常のクエリ文字列になります。


1

URLの部分に標準はありませんが、JavaScriptには1つの標準があります。配列を含むオブジェクトをに渡してURLSearchParams呼び出すtoString()と、コンマで区切られた項目のリストに変換されます。

let data = {
  str: 'abc',
  arr: ['abc', 123]
}

new URLSearchParams(data).toString();  # ?str=abc&arr=abc,123

0

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

?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.