¿Por qué pasar un array en la URL? Y por qué no es tan simple como parece
\nImagina 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.
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\nConceptos básicos: cómo PHP maneja la query string
\nCuando 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í:
array(2) {\n ["nombre"] => string(4) "Juan"\n ["edad"] => string(2) "25"\n}\nPero, ¿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.
Aquí es donde entra en juego la sintaxis de corchetes, creada precisamente para resolver este problema.
\n\nMétodo #1: Sintaxis de corchetes (el más popular)
\nAñade corchetes al nombre del parámetro: color[]. Cuando PHP ve este patrón, crea automáticamente un array. Ejemplo de URL:
?color[]=rojo&color[]=verde&color[]=azul\nEn el servidor, $_GET contendrá:
array(1) {\n ["color"] => array(3) {\n [0] => string(4) "rojo"\n [1] => string(5) "verde"\n [2] => string(4) "azul"\n }\n}\nAhora, 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?>\nResultado en el navegador:
\nColores seleccionados:\n1. rojo\n2. verde\n3. azul\n\nClaves con nombre: cuando el orden no importa
\nA veces necesitas pasar un array asociativo (clave → valor). Para ello, usa la sintaxis clave[] especificando la clave:
?filtro[categoria]=libros&filtro[precio]=100&filtro[en_stock]=1\nPHP lo convertirá en:
\narray(1) {\n ["filtro"] => array(3) {\n ["categoria"] => string(6) "libros"\n ["precio"] => string(3) "100"\n ["en_stock"] => string(1) "1"\n }\n}\nProcesamiento 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\nMétodo #2: JSON en la query string (avanzado)
\nSi 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.
\nFormamos la URL desde el cliente (JavaScript):
\nconst datos = {\n colores: ['rojo', 'verde', 'azul'],\n tallas: ['S', 'M', 'L'],\n opciones: {\n envoltura: tr