Wie übergebe ich ein Array innerhalb einer Abfragezeichenfolge?

353

Gibt es eine Standardmethode zum Übergeben eines Arrays durch eine Abfragezeichenfolge?

Um klar zu sein, habe ich eine Abfragezeichenfolge mit mehreren Werten, von denen einer ein Array-Wert wäre. Ich möchte, dass dieser Abfragezeichenfolgenwert als Array behandelt wird. Ich möchte nicht, dass das Array aufgelöst wird, damit es nicht von den anderen Abfragezeichenfolgenvariablen unterschieden werden kann.

Gemäß dieser Antwort schlägt der Autor vor, dass die Unterstützung von Abfragezeichenfolgen für Arrays nicht definiert ist. Ist das richtig?

BEARBEITEN:

Basierend auf der Antwort von @ Alex gibt es keine Standardmethode, daher ist meine Nachverfolgung eine einfache Methode, um zu erkennen, dass der Parameter, den ich lese, ein Array in PHP und Javascript ist .

Wäre es akzeptabel, mehrere Parameter mit demselben Namen zu benennen, und auf diese Weise würde ich wissen, dass sie zu einem Array gehören? Beispiel:

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

Oder wäre das eine schlechte Praxis?

Yarin
quelle
Welches Framework verwenden Sie? Einige Frameworks verfügen über Methoden, mit denen Arrays an Querystrings übergeben werden können.
TastaturP
@ TastaturP- PHP und Javascript, je nach Anwendungsfall
Yarin
2
Warum sollten Sie das tun wollen, wenn Sie nur tun könnten :? Myarray = Wert1, Wert2, Wert3
Serodis
18
@seroids: Was ist, wenn er Kommas, Fragezeichen, Gleichheitszeichen und nicht druckbare Zeichen übergeben muss?
Berry Tsakala

Antworten:

429

Folgendes habe ich herausgefunden:

Das Senden von Formularfeldern mit mehreren Werten, dh das Senden von Arrays über GET / POST-Variablen, kann auf verschiedene Arten erfolgen, da ein Standard nicht unbedingt festgelegt ist.

Drei Möglichkeiten, mehrwertige Felder oder Arrays zu senden, sind:

  • ?cars[]=Saab&cars[]=Audi (Bester Weg - PHP liest dies in ein Array)
  • ?cars=Saab&cars=Audi (Schlechter Weg - PHP registriert nur den letzten Wert)
  • ?cars=Saab,Audi (Habe das nicht versucht)

Formularbeispiele

In einem Formular können mehrwertige Felder die Form eines Auswahlfelds haben, das auf mehrere festgelegt ist :

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

(HINWEIS: In diesem Fall ist es wichtig, das Auswahlsteuerelement zu benennen some_name[], damit die resultierenden Anforderungsvariablen von PHP als Array registriert werden.)

... oder als mehrere versteckte Felder mit demselben Namen :

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

HINWEIS: Die Verwendung field[]für mehrere Werte ist wirklich schlecht dokumentiert. Ich sehe keine Erwähnung im Abschnitt über mehrwertige Schlüssel in der Abfragezeichenfolge - Wikipedia oder in den W3C-Dokumenten, die sich mit Mehrfachauswahl-Eingaben befassen.


AKTUALISIEREN

Wie Kommentatoren hervorgehoben haben, ist dies sehr rahmenspezifisch. Einige Beispiele:

Abfragezeichenfolge:

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

Schienen:

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

Winkel:

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

(Angular Diskussion )

Beispiele finden Sie in den Kommentaren in node.js , Wordpress , ASP.net


Reihenfolge beibehalten: Eine weitere zu berücksichtigende Sache ist, dass Sie, wenn Sie die Reihenfolge Ihrer Elemente (dh das Array als geordnete Liste) beibehalten müssen , nur eine Option haben, bei der eine begrenzte Werteliste übergeben und explizit in konvertiert wird ein Array selbst.

Yarin
quelle
3
Ich denke, der Grund dafür, dass diese Funktionalität in allgemeinen Quellen wie Wiki oder W3C nicht dokumentiert ist, ist, dass sie im Allgemeinen nicht von Web-Frameworks unterstützt wird. PHP und ich denke, Rails konvertieren automatisch mehrere "key []" - Abfrageparameter in ein Array. Andere nicht.
Carl G
3
Das Knoten-Querystring-Modul verwendet das ?cars=Saab&cars=AudiFormular
SystemParadox
53
In express (node.js) werden beide ?cars=Saab&cars=Audiund ?cars[]=Saab&cars[]=Audiin Arrays umgewandelt. Jedoch ?cars=Saabendet als String, sondern ?cars[]=Saabist ein Array mit einem einzelnen Elemente.
Trevor Dixon
5
Können Sie mit diesem Ansatz Schlüssel festlegen? Und was ist mit mehrdimensionalen Arrays?
Qwerty
5
ASP.NET MVC scheint das Format nicht zu lesen. ?cars[]=Saab&cars[]=AudiEs gibt entweder keine eckigen Klammern oder die eckigen Klammern benötigen Indizes /
Mr. Flibble
37

Eine Abfragezeichenfolge enthält Textdaten, sodass das Array nur aufgelöst, korrekt codiert und in einem Darstellungsformat Ihrer Wahl übergeben werden kann:

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

und dekodieren Sie es dann in Ihrem serverseitigen Code.

Alex K.
quelle
OK, danke für die Klarstellung. Können Sie meine überarbeitete Frage sehen - ist es notwendig, p1 ... pn für Schlüssel auszuführen, oder kann ich einfach mehrere Schlüssel 'p' nennen, und auf diese Weise würde ich wissen, dass sie alle zu demselben Array gehören?
Yarin
1
Sie können denselben Namen verwenden. stackoverflow.com/questions/2203430/… oder einfach p = aa, bb, cc, was der offensichtlichste Weg ist, wie Serodis kommentierte.
Alex K.
sehr nützlich mit JSON.stringifyund JSON.parse!
Charliebrownie
1
Ein einfaches und allgemeines Darstellungsformat ist JSON, in PHP json_encodedann rawurlencodeund json_decodeauf der anderen Seite.
Edward
20

Ich glaube nicht, dass es einen Standard gibt.
Jede Webumgebung bietet ihren eigenen "Standard" für solche Dinge. Außerdem ist die URL normalerweise zu kurz für irgendetwas (bei einigen Browsern maximal 256 Bytes). Natürlich können längere Arrays / Daten mit POST-Anfragen gesendet werden.

Es gibt jedoch einige Methoden:

  1. Es gibt eine PHP-Methode, bei der in URL-Abfragen eckige Klammern ( [, ]) verwendet werden. Zum Beispiel ?array_name[]=item&array_name[]=item_2funktioniert eine Abfrage, von der gesagt wurde, dass sie trotz schlechter Dokumentation funktioniert, und PHP konvertiert sie automatisch in ein Array. Quelle: https://stackoverflow.com/a/9547490/3787376

  2. Objektdatenaustauschformate (z. B. JSON - offizielle Website , PHP-Dokumentation ) können ebenfalls verwendet werden, wenn sie über Methoden zum Konvertieren von Variablen in und aus Zeichenfolgen verfügen, wie dies bei JSON der Fall ist.
    Außerdem ist ein URL-Encoder (für die meisten Programmiersprachen verfügbar) erforderlich, damit HTTP-Abrufanforderungen die Zeichenfolgendaten korrekt codieren können.

Obwohl die "Methode der eckigen Klammern" einfach ist und funktioniert, ist sie auf PHP und Arrays beschränkt.
Wenn andere Variablentypen wie Klassen oder das Übergeben von Variablen in Abfragezeichenfolgen in einer anderen Sprache als PHP erforderlich sind, wird die JSON-Methode empfohlen.

Beispiel in PHP der JSON-Methode (Methode 2):

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

Code für die Empfangsseite (PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.
Berry Tsakala
quelle
1
Express.js unterstützt auch die in 4.13.4 getestete eckige Klammer.
Steve Kehlet
7

Ich denke, es wäre hilfreich für jemanden, der das Array in einer Abfragezeichenfolge an ein Servlet übergeben möchte. Ich habe die folgende Abfragezeichenfolge getestet und konnte die Array-Werte mit req.getgetParameterValues ​​() abrufen. Methode. Unten ist die Abfragezeichenfolge, die ich über den Browser übergeben habe.

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

Das Kontrollkästchen ist hier mein Parameterarray.

vara
quelle
5

Das funktioniert bei mir:

Im Link hat das Attribut den Wert:

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

Route kann damit umgehen:

path="/filter/:arr"

Für mehrere Arrays:

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

Route bleibt gleich.

BILDSCHIRMFOTO

Geben Sie hier die Bildbeschreibung ein

Alia
quelle
2

Sie erwähnen PHP und Javascript in Ihrer Frage, aber nicht in den Tags. Ich habe diese Frage mit der Absicht erreicht, ein Array an eine MVC.Net-Aktion zu übergeben.

Ich habe hier die Antwort auf meine Frage gefunden : Das erwartete Format ist das, das Sie in Ihrer Frage vorgeschlagen haben, mit mehreren Parametern mit demselben Namen.

DCShannon
quelle
2
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert.
Andrew
@ Andrew Es ist nicht nur eine Linkantwort. "Das erwartete Format ist das, das Sie in Ihrer Frage vorgeschlagen haben, wobei mehrere Parameter denselben Namen haben."
DCShannon
2

Ich benutze React and Rails. Ich tat:

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
Linielson
quelle
1

Sie können http_build_query verwenden , um einen URL-codierten Querystring aus einem Array in PHP zu generieren. Während der resultierende Querystring erweitert wird, können Sie ein eindeutiges Trennzeichen als Parameter für die http_build_queryMethode auswählen. Wenn Sie also dekodieren, können Sie überprüfen, welches Trennzeichen verwendet wurde. Wenn es das eindeutige wäre, das Sie ausgewählt haben, wäre dies der Array-Querystring, andernfalls der normale Querystring.

TastaturP
quelle
1

Obwohl es im URL-Teil keinen Standard gibt, gibt es einen Standard für JavaScript. Wenn Sie Objekte mit Arrays an übergeben URLSearchParamsund aufrufen toString(), wird es in eine durch Kommas getrennte Liste von Elementen umgewandelt:

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

new URLSearchParams(data).toString();  # ?str=abc&arr=abc,123
João Haas
quelle
0

Überprüfen Sie die parse_stringFunktion http://php.net/manual/en/function.parse-str.php

Es werden alle Variablen aus einer Abfragezeichenfolge zurückgegeben, einschließlich Arrays.

Beispiel von 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

?>
Dan Murfitt
quelle