Как передать массив в query string (строке запроса) в PHP?
Подробное объяснение передачи массивов через query string
Вы на правильном пути! PHP действительно поддерживает передачу массивов через query string, но есть несколько важных нюансов. Давайте разберём всё по порядку.
Основной синтаксис
Чтобы PHP правильно распознал массив в query string, нужно использовать квадратные скобки [] в имени параметра. Пример:
// URL: page.php?fruits[]=apple&fruits[]=banana&fruits[]=orange
// На стороне получателя:
$fruits = $_GET['fruits']; // ['apple', 'banana', 'orange']
Использование http_build_query()
Функция http_build_query() автоматически добавляет квадратные скобки для массивов. Но есть одна хитрость — по умолчанию она использует числовые ключи (fruits[0], fruits[1]). Если вам нужны только значения без ключей, используйте флаг:
$fruits = ['apple', 'banana', 'orange'];
$queryString = http_build_query(['fruits' => $fruits], '', '&', PHP_QUERY_RFC3986);
// Результат: fruits%5B0%5D=apple&fruits%5B1%5D=banana&fruits%5B2%5D=orange
// (URL-encoded, но PHP всё равно поймёт)
Ассоциативные массивы
Можно передавать и ассоциативные массивы:
// Формируем URL
$params = ['user' => ['name' => 'John', 'age' => 30]];
$url = 'page.php?' . http_build_query($params);
// URL: page.php?user%5Bname%5D=John&user%5Bage%5D=30
// Получаем:
$user = $_GET['user']; // ['name' => 'John', 'age' => 30]
Многомерные массивы
PHP поддерживает многомерные массивы любой вложенности:
// Создаём URL
$data = [
'items' => [
['id' => 1, 'name' => 'Apple'],
['id' => 2, 'name' => 'Banana']
]
];
$url = 'page.php?' . http_build_query($data);
// URL: page.php?items%5B0%5D%5Bid%5D=1&items%5B0%5D%5Bname%5D=Apple&items%5B1%5D%5Bid%5D=2&items%5B1%5D%5Bname%5D=Banana
// Получаем:
$items = $_GET['items']; // Полноценный многомерный массив
Почему у вас могло не работать?
Возможные причины:
- URL-кодирование: Если вы вручную формируете строку, не забудьте закодировать спецсимволы через
urlencode(). - Длина URL: Браузеры имеют ограничение на длину URL (обычно 2048 символов). Для больших массивов используйте POST-запросы.
- Версия PHP: В старых версиях (до 5.4) могла быть другая обработка. Сейчас всё работает стабильно.
Проверка на стороне сервера
Всегда проверяйте, что данные пришли корректно:
if (isset($_GET['fruits']) && is_array($_GET['fruits'])) {
$fruits = $_GET['fruits'];
// Обработка массива
} else {
echo 'Массив не передан или имеет неверный формат';
}
Важные замечания
- Не передавайте через query string конфиденциальные данные (пароли, токены) — они остаются в истории браузера и логах сервера.
- Для больших объёмов данных (больше 100 элементов) используйте POST или сессии.
- Помните о безопасности: всегда фильтруйте и валидируйте входящие данные.
Теперь вы знаете, как правильно передавать массивы через query string. Используйте http_build_query() для формирования и проверяйте is_array() при получении.
Альтернативный подход: сериализация в JSON
Если вам нужно передать сложную структуру данных, можно использовать JSON. Это особенно удобно, когда массив содержит разнотипные данные или когда вы работаете с JavaScript на фронтенде.
// Формируем URL
$data = ['apple', 'banana', 'orange'];
$encoded = urlencode(json_encode($data));
$url = "page.php?data={$encoded}";
// URL: page.php?data=%5B%22apple%22%2C%22banana%22%2C%22orange%22%5D
// Получаем на сервере
$json = $_GET['data'] ?? '';
$array = json_decode($json, true); // true для ассоциативного массива
if (json_last_error() === JSON_ERROR_NONE) {
print_r($array); // ['apple', 'banana', 'orange']
} else {
echo 'Ошибка декодирования JSON';
}
Плюсы и минусы
- + Поддерживает любые вложенные структуры и типы данных.
- + Легко интегрируется с JavaScript (JSON.parse).
- - URL становится длиннее из-за URL-кодирования.
- - Требуется дополнительная валидация JSON.
Этот метод хорош для API-запросов или когда нужно передать сложные структуры, но для простых массивов лучше использовать стандартный синтаксис PHP с квадратными скобками.