Como passar uma matriz dentro de uma string de consulta?

353

Existe uma maneira padrão de passar uma matriz através de uma string de consulta?

Para ser claro, eu tenho uma string de consulta com vários valores, um dos quais seria um valor de matriz. Quero que esse valor da string de consulta seja tratado como uma matriz - não quero que a matriz seja explodida para que seja indistinguível das outras variáveis ​​da string de consulta.

Além disso, de acordo com esta resposta da postagem , o autor sugere que o suporte da string de consulta para matrizes não está definido. Isso é preciso?

EDITAR:

Com base na resposta de @ Alex, não há uma maneira padrão de fazer isso, então meu acompanhamento é então o que é uma maneira fácil de reconhecer que o paramater que estou lendo é uma matriz em PHP e Javascript ?

Seria aceitável nomear vários parâmetros como o mesmo nome, e assim eu saberia que eles pertencem a uma matriz? Exemplo:

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

Ou isso seria uma prática ruim?

Yarin
fonte
Qual estrutura você está usando? Algumas estruturas têm métodos para ajudar a passar matrizes para strings de consulta.
keyboardP
@ keyboardP- PHP e Javascript, dependendo do caso de uso
Yarin
2
Por que você iria querer fazer isso quando você poderia apenas fazer:? Myarray = value1, value2, value3
Serodis
18
@seroids: e se ele tiver que passar vírgulas, pontos de interrogação, sinais de igual e caracteres não imprimíveis?
Berry Tsakala

Respostas:

429

Aqui está o que eu descobri:

O envio de campos de formulário com vários valores, ou seja, o envio de matrizes através de vars GET / POST, pode ser feito de várias maneiras diferentes, pois um padrão não é necessariamente explicitado.

Três maneiras possíveis de enviar campos ou matrizes com vários valores seriam:

  • ?cars[]=Saab&cars[]=Audi (Melhor maneira - o PHP lê isso em uma matriz)
  • ?cars=Saab&cars=Audi (Mau modo - o PHP registrará apenas o último valor)
  • ?cars=Saab,Audi (Ainda não tentei isso)

Exemplos de formulário

Em um formulário, os campos com valores múltiplos podem assumir a forma de uma caixa de seleção definida como múltipla :

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

(NOTA: Nesse caso, seria importante nomear o controle select some_name[], para que os vars de solicitação resultantes fossem registrados como uma matriz pelo PHP)

... ou como vários campos ocultos com o mesmo nome :

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

NOTA: O uso field[]de vários valores é realmente pouco documentado. Não vejo nenhuma menção a isso na seção sobre chaves com vários valores na string de consulta - Wikipedia ou nos documentos do W3C que lidam com entradas com várias seleções.


ATUALIZAR

Como comentaram os comentaristas, isso é muito específico da estrutura. Alguns exemplos:

Cadeia de consulta:

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

Trilhos:

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

( Discussão angular )

Veja comentários para exemplos em node.js , Wordpress , ASP.net


Manutenção da ordem: Mais uma coisa a considerar é que, se você precisar manter a ordem dos seus itens (ou seja, matriz como uma lista ordenada), realmente terá apenas uma opção: passar uma lista delimitada de valores e convertê-la explicitamente em uma matriz você mesmo.

Yarin
fonte
3
Eu acho que a razão pela qual essa funcionalidade não está documentada em fontes gerais como Wiki ou W3C é que geralmente não é suportada por estruturas da web. O PHP e eu acho que o Rails converte automaticamente vários parâmetros de consulta "key []" em uma matriz. Outros não.
Carl G
3
O módulo nodejs querystring usa o ?cars=Saab&cars=Audiformulário
SystemParadox 25/10
53
No express (node.js), ambos ?cars=Saab&cars=Audie ?cars[]=Saab&cars[]=Audisão transformados em matrizes. No entanto, ?cars=Saabacaba como uma sequência, mas ?cars[]=Saabé uma matriz com um único elemento.
Trevor Dixon
5
Você pode definir chaves usando essa abordagem? E quanto a matrizes multidimensionais?
Qwerty 23/05
5
O ASP.NET MVC não parecem ler o formato ?cars[]=Saab&cars[]=AudiTem quer haver brakets quadrados ou os colchetes precisa índices /
O Sr. Flibble
37

Uma string de consulta carrega dados textuais, portanto não há opção a não ser explodir a matriz, codificá-la corretamente e passá-la em um formato representacional de sua escolha:

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

e decodifique-o no código do lado do servidor.

Alex K.
fonte
OK, obrigado pelo esclarecimento. Você pode ver minha pergunta revisada - é necessário fazer p1 ... pn, para chaves, ou posso apenas nomear várias chaves 'p', e dessa maneira eu saberia que todas elas pertencem à mesma matriz?
Yarin
11
Você pode usar o mesmo nome; stackoverflow.com/questions/2203430/… ou apenas p = aa, bb, cc, que é a maneira mais óbvia como comentou Serodis.
Alex K.
muito útil com JSON.stringifye JSON.parse!
Charliebrownie
11
Um formato representacional simples e comum é JSON, em PHP, usando json_encodeentão rawurlencodee json_decodena outra página.
Edward
20

Eu não acho que exista um padrão.
Cada ambiente da web fornece seu próprio 'padrão' para essas coisas. Além disso, o URL geralmente é muito curto para qualquer coisa (limite de 256 bytes em alguns navegadores). Obviamente, matrizes / dados mais longos podem ser enviados com solicitações POST.

No entanto, existem alguns métodos:

  1. Existe uma maneira PHP, que usa colchetes ( [, ]) nas consultas de URL. Por exemplo, uma consulta como a ?array_name[]=item&array_name[]=item_2que se diz funcionar, apesar de mal documentada, com o PHP convertendo-a automaticamente em uma matriz. Fonte: https://stackoverflow.com/a/9547490/3787376

  2. Os formatos de intercâmbio de dados de objetos (por exemplo, JSON - site oficial , documentação do PHP ) também podem ser usados ​​se eles tiverem métodos de conversão de variáveis ​​de e para strings, como o JSON.
    Também é necessário um codificador de URL (disponível para a maioria das linguagens de programação) para solicitações de obtenção HTTP para codificar os dados da string corretamente.

Embora o "método entre colchetes" seja simples e funcione, ele é limitado ao PHP e matrizes.
Se outros tipos de variáveis, como classes ou variáveis ​​de passagem dentro de cadeias de consulta em um idioma diferente do PHP, forem necessários, o método JSON é recomendado.

Exemplo no PHP do método JSON (método 2):

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

Código para receber a página (PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.
Berry Tsakala
fonte
11
O Express.js também suporta a notação de colchete, testada em 4.13.4.
Steve Kehlet
7

Eu acho que seria útil para alguém que está procurando passar a matriz em uma string de consulta para um servlet. Eu testei abaixo da string de consulta e consegui obter os valores da matriz usando req.getgetParameterValues ​​(); método. Abaixo está a string de consulta que passei pelo navegador.

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

checkbox é minha matriz de parâmetros aqui.

vara
fonte
5

Isso funciona para mim:

No link, atribuir tem valor:

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

A rota pode lidar com isso:

path="/filter/:arr"

Para várias matrizes:

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

A rota permanece a mesma.

SCREENSHOT

insira a descrição da imagem aqui

Alia
fonte
2

Você mencionou PHP e Javascript na sua pergunta, mas não nas tags. Cheguei a essa pergunta com a intenção de passar uma matriz para uma ação MVC.Net.

Encontrei a resposta para minha pergunta aqui : o formato esperado é o que você propôs na sua pergunta, com vários parâmetros com o mesmo nome.

DCShannon
fonte
2
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada.
Andrew
@ Andrew Não é uma resposta apenas do link. "O formato esperado é o que você propôs na sua pergunta, com vários parâmetros com o mesmo nome."
DCShannon
2

Eu uso React e Rails. Eu fiz:

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
fonte
1

Você pode usar http_build_query para gerar uma string de consulta codificada em URL a partir de uma matriz no PHP. Embora a string de consulta resultante seja expandida, você pode decidir sobre um separador exclusivo que deseja como parâmetro para o http_build_querymétodo. Portanto, quando se trata de decodificação, é possível verificar qual separador foi usado. Se foi o único que você escolheu, essa seria a string de consulta da matriz, caso contrário, seriam as strings de consulta normais.

keyboardP
fonte
1

Embora não haja um padrão na parte da URL, há um padrão para JavaScript. Se você passar objetos contendo matrizes para URLSearchParams, e invocá toString()-lo, ele o transformará em uma lista de itens separados por vírgula:

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

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

Verifique a parse_stringfunção http://php.net/manual/en/function.parse-str.php

Ele retornará todas as variáveis ​​de uma string de consulta, incluindo matrizes.

Exemplo do 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
fonte