Cómo pasar un array en query string: guía completa en PHP

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué pasar un array en la URL? Y por qué no es tan simple como parece

\n

Imagina que estás creando un filtro de productos para una tienda online en PHP. El usuario selecciona varias categorías, varios colores y un rango de precios. ¿Cómo enviar todos estos datos al servidor mediante una petición GET? La solución obvia sería ?category=1&category=2&category=3. Pero el servidor solo verá el último valor, a menos que uses un truco.

\n

En Stack Overflow, la pregunta "How to pass an array within a query string?" tiene decenas de miles de visitas. Los desarrolladores tropiezan con esto a diario. Hoy vamos a desglosar este tema de principio a fin: te mostraré cómo pasar un array correctamente a través de una URL, cómo procesarlo en el servidor y qué errores evitar.

\n

¿Listo para convertir parámetros GET caóticos en una estructura de datos ordenada? ¡Vamos allá!

\n\n

Conceptos básicos: cómo PHP maneja la query string

\n

Cuando envías una petición GET, PHP llena automáticamente el array superglobal $_GET. Si la URL contiene ?nombre=Juan&edad=25, entonces $_GET se verá así:

\n
array(2) {\n  ["nombre"] => string(4) "Juan"\n  ["edad"] => string(2) "25"\n}
\n

Pero, ¿qué pasa si intentamos pasar varios valores con la misma clave? Probemos con la URL: ?color=rojo&color=verde&color=azul. El servidor solo recibirá color=azul. Los demás valores se sobrescriben porque PHP no sabe qué hacer con claves duplicadas.

\n

Aquí es donde entra en juego la sintaxis de corchetes, creada precisamente para resolver este problema.

\n\n

Método #1: Sintaxis de corchetes (el más popular)

\n

Añade corchetes al nombre del parámetro: color[]. Cuando PHP ve este patrón, crea automáticamente un array. Ejemplo de URL:

\n
?color[]=rojo&color[]=verde&color[]=azul
\n

En el servidor, $_GET contendrá:

\n
array(1) {\n  ["color"] => array(3) {\n    [0] => string(4) "rojo"\n    [1] => string(5) "verde"\n    [2] => string(4) "azul"\n  }\n}
\n

Ahora, un ejemplo de código PHP que lo procesa:

\n
<?php\n// URL: ejemplo.com?color[]=rojo&color[]=verde&color[]=azul\nif (isset($_GET['color']) && is_array($_GET['color'])) {\n    echo "Colores seleccionados:<br>";\n    foreach ($_GET['color'] as $indice => $color) {\n        echo ($indice + 1) . ". " . htmlspecialchars($color) . "<br>";\n    }\n}\n?>
\n

Resultado en el navegador:

\n
Colores seleccionados:\n1. rojo\n2. verde\n3. azul
\n\n

Claves con nombre: cuando el orden no importa

\n

A veces necesitas pasar un array asociativo (clave → valor). Para ello, usa la sintaxis clave[] especificando la clave:

\n
?filtro[categoria]=libros&filtro[precio]=100&filtro[en_stock]=1
\n

PHP lo convertirá en:

\n
array(1) {\n  ["filtro"] => array(3) {\n    ["categoria"] => string(6) "libros"\n    ["precio"] => string(3) "100"\n    ["en_stock"] => string(1) "1"\n  }\n}
\n

Procesamiento en el servidor:

\n
<?php\nif (isset($_GET['filtro'])) {\n    $filtro = $_GET['filtro'];\n    $consulta = "SELECT * FROM productos WHERE 1=1";\n    if (!empty($filtro['categoria'])) {\n        $consulta .= " AND categoria = '" . mysqli_real_escape_string($conn, $filtro['categoria']) . "'";\n    }\n    if (!empty($filtro['precio'])) {\n        $consulta .= " AND precio <= " . (int)$filtro['precio'];\n    }\n    // ... demás condiciones\n}\n?>
\n\n

Método #2: JSON en la query string (avanzado)

\n

Si el array es complejo (anidado en varios niveles), la sintaxis de corchetes se vuelve engorrosa. Una alternativa es pasar una cadena JSON codificada para URL.

\n

Formamos la URL desde el cliente (JavaScript):

\n
const datos = {\n    colores: ['rojo', 'verde', 'azul'],\n    tallas: ['S', 'M', 'L'],\n    opciones: {\n        envoltura: tr                

Blogs

Book Recommendations