¿Cómo pasar una matriz dentro de una cadena de consulta?

353

¿Hay una forma estándar de pasar una matriz a través de una cadena de consulta?

Para que quede claro, tengo una cadena de consulta con varios valores, uno de los cuales sería un valor de matriz. Quiero que el valor de la cadena de consulta se trate como una matriz: no quiero que la matriz se explote para que no se pueda distinguir de las otras variables de cadena de consulta.

Además, según esta respuesta de la publicación , el autor sugiere que el soporte de cadena de consulta para matrices no está definido. ¿Es esto exacto?

EDITAR:

Según la respuesta de @ Alex, no hay una forma estándar de hacer esto, así que mi seguimiento es, entonces, ¿cuál es una manera fácil de reconocer que el parámetro que estoy leyendo es una matriz en PHP y Javascript ?

¿Sería aceptable nombrar múltiples parámetros con el mismo nombre, y de esa manera sabría que pertenecen a una matriz? Ejemplo:

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

¿O sería una mala práctica?

Yarin
fuente
¿Qué marco estás usando? Algunos marcos tienen métodos para ayudar a pasar matrices a cadenas de consulta.
keyboardP
@ keyboardP- PHP y Javascript, dependiendo del caso de uso
Yarin
2
¿Por qué querrías hacer eso si pudieras hacer:? Myarray = value1, value2, value3
Serodis
18
@seroids: ¿qué pasa si tiene que pasar comas, signos de interrogación, signos iguales y caracteres no imprimibles?
Berry Tsakala 05 de

Respuestas:

429

Esto es lo que descubrí:

El envío de campos de formulario de valores múltiples, es decir, el envío de matrices a través de variables GET / POST, se puede hacer de varias maneras diferentes, ya que un estándar no necesariamente se detalla.

Las tres formas posibles de enviar campos o matrices de valores múltiples serían:

  • ?cars[]=Saab&cars[]=Audi (La mejor manera: PHP lee esto en una matriz)
  • ?cars=Saab&cars=Audi (Mala manera: PHP solo registrará el último valor)
  • ?cars=Saab,Audi (No he probado esto)

Ejemplos de formularios

En un formulario, los campos de valores múltiples pueden tomar la forma de un cuadro de selección establecido en múltiples :

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

(NOTA: en este caso, sería importante nombrar el control de selección some_name[], de modo que los vars de solicitud resultantes se registren como una matriz por PHP)

... o como múltiples campos ocultos con el mismo nombre :

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

NOTA: El uso field[]para valores múltiples está realmente mal documentado. No veo ninguna mención al respecto en la sección sobre claves de valores múltiples en Cadena de consulta - Wikipedia , o en los documentos del W3C que tratan con entradas de selección múltiple.


ACTUALIZAR

Como los comentaristas han señalado, esto es muy específico del marco. Algunos ejemplos:

Cadena 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

Rieles:

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

(Angular Discusión )

Ver comentarios para ejemplos en node.js , Wordpress , ASP.net


Mantenimiento del orden: una cosa más a tener en cuenta es que si necesita mantener el orden de sus elementos (es decir, la matriz como una lista ordenada), realmente solo tiene una opción, que es pasar una lista delimitada de valores y convertirla explícitamente a una matriz tu mismo.

Yarin
fuente
3
Creo que la razón por la que esta funcionalidad no está documentada en fuentes generales como Wiki o W3C es que generalmente no es compatible con los marcos web. PHP y creo que Rails convierte automáticamente múltiples parámetros de consulta "clave []" en una matriz. Otros no.
Carl G
3
El módulo de cadena de consulta de nodejs utiliza el ?cars=Saab&cars=Audiformulario
SystemParadox
53
En express (node.js), ambos ?cars=Saab&cars=Audiy ?cars[]=Saab&cars[]=Audise convierten en matrices. Sin embargo, ?cars=Saabtermina como una cadena, pero ?cars[]=Saabes una matriz con un solo elemento.
Trevor Dixon
55
¿Puedes configurar las teclas con este enfoque? ¿Y qué hay de las matrices multidimensionales?
Qwerty
55
ASP.NET MVC no parece leer el formato ?cars[]=Saab&cars[]=AudiNo hay corchetes o los corchetes necesitan índices /
Mr. Flibble
37

Una cadena de consulta contiene datos textuales, por lo que no hay otra opción que explotar la matriz, codificarla correctamente y pasarla en un formato de representación de su elección:

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

y luego descifrarlo en el código del lado del servidor.

Alex K.
fuente
OK, gracias por la aclaración. ¿Puedes ver mi pregunta revisada: es necesario hacer p1 ... pn para las teclas o puedo nombrar varias teclas 'p' y de esa manera sabría que todas pertenecen a la misma matriz?
Yarin
1
Puedes usar el mismo nombre; stackoverflow.com/questions/2203430/… o simplemente p = aa, bb, cc, que es la forma más obvia, como comentó Serodis.
Alex K.
muy útil con JSON.stringifyy JSON.parse!
charliebrownie
1
Un formato de representación simple y común es JSON, en PHP usando json_encodeentonces rawurlencodey json_decodeen la otra página.
Edward
20

No creo que haya un estándar.
Cada entorno web proporciona su propio 'estándar' para tales cosas. Además, la url suele ser demasiado corta para cualquier cosa (límite de 256 bytes en algunos navegadores). Por supuesto, se pueden enviar matrices / datos más largos con solicitudes POST.

Sin embargo, hay algunos métodos:

  1. Hay una forma PHP, que utiliza corchetes ( [, ]) en las consultas de URL. Por ejemplo, una consulta como ?array_name[]=item&array_name[]=item_2se dice que funciona, a pesar de estar mal documentada, con PHP convirtiéndola automáticamente en una matriz. Fuente: https://stackoverflow.com/a/9547490/3787376

  2. Los formatos de intercambio de datos de objetos (por ejemplo, JSON - sitio web oficial , documentación de PHP ) también se pueden usar si tienen métodos para convertir variables de y hacia cadenas como lo hace JSON.
    También se requiere un codificador de URL (disponible para la mayoría de los lenguajes de programación) para que HTTP obtenga solicitudes para codificar los datos de la cadena correctamente.

Aunque el "método de corchetes" es simple y funciona, está limitado a PHP y matrices.
Si se requieren otros tipos de variables, como clases o variables de paso dentro de cadenas de consulta en un lenguaje que no sea PHP, se recomienda el método JSON.

Ejemplo en PHP del 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 recibir la página (PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.
Berry Tsakala
fuente
1
Express.js también admite notación de corchetes, probado en 4.13.4.
Steve Kehlet
7

Creo que sería útil para alguien que está buscando pasar la matriz en una cadena de consulta a un servlet. Probé debajo de la cadena de consulta y pude obtener los valores de la matriz usando req.getgetParameterValues ​​(); método. A continuación se muestra la cadena de consulta que pasé a través del navegador.

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

casilla de verificación es mi matriz de parámetros aquí.

vara
fuente
5

Esto funciona para mi:

En el enlace, atribuir tiene valor:

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

La ruta puede manejar esto:

path="/filter/:arr"

Para múltiples matrices:

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

La ruta se mantiene igual.

CAPTURA DE PANTALLA

ingrese la descripción de la imagen aquí

Alia
fuente
2

Menciona PHP y Javascript en su pregunta, pero no en las etiquetas. Llegué a esta pregunta con la intención de pasar una matriz a una acción MVC.Net.

Encontré la respuesta a mi pregunta aquí : el formato esperado es el que propuso en su pregunta, con múltiples parámetros que tienen el mismo nombre.

DCShannon
fuente
2
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia.
Andrew
@ Andrew No es una respuesta de solo enlace. "El formato esperado es el que propuso en su pregunta, con múltiples parámetros que tienen el mismo nombre".
DCShannon
2

Yo uso React and Rails. Yo hice:

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

Puede usar http_build_query para generar una cadena de consulta codificada en URL a partir de una matriz en PHP. Si bien la cadena de consulta resultante se expandirá, puede elegir un separador único que desee como parámetro del http_build_querymétodo, por lo que cuando se trata de decodificar, puede verificar qué separador se utilizó. Si fue el único que eligió, entonces esa sería la cadena de consulta de la matriz, de lo contrario serían las cadenas de consulta normales.

keyboardP
fuente
1

Aunque no hay un estándar en la parte de URL, hay un estándar para JavaScript. Si pasa objetos que contienen matrices URLSearchParamsy lo llama toString(), lo transformará en una lista de elementos separados por comas:

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

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

Verifique la parse_stringfunción http://php.net/manual/en/function.parse-str.php

Devolverá todas las variables de una cadena de consulta, incluidas las matrices.

Ejemplo de 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
fuente