479

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

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

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

編集:

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

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

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

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

4

11 に答える 11

546

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

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

(注:この場合、selectコントロールに名前を付けることが重要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"

Angular:

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

(角度のある議論

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


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

于 2012-03-03T16:01:04.377 に答える
45

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

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

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

于 2011-06-05T13:17:28.627 に答える
25

基準はないと思います。
各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メソッドをお勧めします。

PHPでのJSONメソッド(メソッド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.
于 2011-06-05T13:46:28.150 に答える
15

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

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

new URLSearchParams(data).toString();
// ?str=abc&arr=abc,123 (with escaped comma characters)
于 2020-03-04T21:07:51.370 に答える
14

これは私のために働きます:

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

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

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

path="/filter/:arr"

複数のアレイの場合:

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

ルートは同じままです。

スクリーンショット

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

更新: この文字列構造を実現するには、query-stringが最適なパッケージです。

例えば:

import { stringify, parse } from 'query-string';

const queryParams={
   fruits:['apple','banana'],
   vegetables:['potato','onion']
}
//arrayFormat can be bracket or comma 
stringify(queryParams, { arrayFormat: 'bracket' });
于 2018-11-30T06:38:15.357 に答える
7

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

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

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

于 2013-01-08T11:38:39.293 に答える
4

私は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
于 2019-09-11T18:20:58.890 に答える
4

query-stringモジュールは、サポートするさまざまなタイプの配列エンコーディングを一覧表示することに注意してください(https://www.npmjs.com/package/query-string)。

たとえば、{foo:['1'、 '2'、 '3']}は次のようにエンコードできます:

'foo[]=1&foo[]=2&foo[]=3'
'foo[0]=1&foo[1]=2&foo[3]=3'
'foo=1,2,3'
'foo=1&foo=2&foo=3'
// Any custom separator can be used:
'foo=1|2|3'
// ... and more custom formats

これは、そこに採用されている多くのソリューションがあることを示しています...

于 2021-04-14T16:17:19.263 に答える
2

質問ではPHPとJavascriptについて言及していますが、タグでは言及していません。配列をMVC.Netアクションに渡すことを意図して、この質問に到達しました。

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

于 2015-03-24T00:59:47.693 に答える
1

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

于 2011-06-05T15:51:28.047 に答える
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

?>
于 2012-03-03T16:13:02.157 に答える