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

Resuelto Yarin asked hace 54 años • 12 respuestas

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

Para ser claros, tengo una cadena de consulta con múltiples 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 la cadena de consulta.

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

EDITAR:

Según la respuesta de @Alex, no existe una forma estándar de hacer esto, por lo que mi seguimiento es: ¿cuál es una manera fácil de reconocer que el parámetro que estoy leyendo es una matriz tanto en PHP como en Javascript ?

¿Sería aceptable nombrar varios 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 esta una mala práctica?

Yarin avatar Jan 01 '70 08:01 Yarin
Aceptado

Esto es lo que descubrí:

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

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 (Mal modo: 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 podrían tomar la forma de un cuadro de selección configurado en múltiple :

<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 PHP registre las variables de solicitud resultantes como una matriz)

... 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 múltiples valores está muy poco 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 sobre entradas de selección múltiple.


ACTUALIZAR

Como han señalado los comentaristas, esto es en gran medida 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"

( Discusión angular )

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


Mantener el orden: una cosa más a considerar es que si necesita mantener el orden de sus elementos (es decir, una matriz como una lista ordenada), en realidad solo tiene una opción, que es pasar una lista delimitada de valores y convertirla explícitamente a una matriz usted mismo.

Yarin avatar Mar 03 '2012 16:03 Yarin

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

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

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

Alex K. avatar Jun 05 '2011 13:06 Alex K.

No creo que haya un estándar.
Cada entorno web proporciona su propio "estándar" para este tipo de 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, existen algunos métodos:

  1. Existe una forma PHP que utiliza corchetes ( [, ]) en consultas URL. Por ejemplo, una consulta como la que ?array_name[]=item&array_name[]=item_2se ha dicho funciona, a pesar de estar mal documentada, y PHP la convierte 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 PHP ) también se pueden utilizar si tienen métodos para convertir variables hacia y desde 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 las solicitudes de obtención HTTP codifiquen los datos de la cadena correctamente.

Aunque el "método de los corchetes" es simple y funciona, está limitado a PHP y matrices.
Si se requieren otros tipos de variables, como clases o pasar variables 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 página (PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.
Berry Tsakala avatar Jun 05 '2011 13:06 Berry Tsakala

Esto funciona para mí:

En 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 sigue siendo la misma.

CAPTURA DE PANTALLA

ingrese la descripción de la imagen aquí

ACTUALIZACIÓN: Para lograr esta estructura de cadena, query-string es el mejor paquete.

Por ejemplo:

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

const queryParams={
   fruits:['apple','banana'],
   vegetables:['potato','onion']
}
//arrayFormat can be bracket or comma 
stringify(queryParams, { arrayFormat: 'bracket' });
Alia Anis avatar Nov 30 '2018 06:11 Alia Anis