#php #arrays #url
#php #массивы #url
Вопрос:
Это, должно быть, вопрос новичка, но…
Как я могу получить массив $ _GET [‘i’] из URL «index.php?i= 1 amp; i = 2 amp; i3» вместо «index.php?i []= 1 amp;i [] = 2 amp; i [] = 3»?
Ответ №1:
PHP не может автоматически преобразовываться index?i=1amp;i=2amp;i=3
в переменную массива. Вам придется вручную проанализировать это и создать массив самостоятельно.
preg_match_all('/(w )=([^amp;]*)/', $_SERVER["QUERY_STRING"], $match, PREG_SET_ORDER);
$_GET = array();
foreach ($match as $row) {
list(, $key, $value) = $row;
$_GET[$key][] = urldecode($value);
}
Обратите внимание, что это мешает обычным параметрам URL. Вам придется использовать более сложный подход, если вы хотите сохранить нормальное поведение.
Комментарии:
1. Я никогда раньше не видел этой записи. Не является foreach($match как $key => $value)?
2. Это немного сложнее из-за структуры результата, которую вернет PREG_SET_ORDER. Здесь вам придется вручную развернуть строки.
3. Добавлено
urldecode
. Регулярное выражение явно неточно в любом случае, принимая только буквенно-цифровые ключи, поэтому там не требуется декодирование.
Ответ №2:
Хотя стандарт HTTP этого не запрещает, PHP не поддерживает его «из коробки». Вы должны сделать это сами:
$q = 'a=1amp;a=2amp;a=3amp;b=1';
$vars = array();
foreach (explode('amp;', $q) as $part) {
list($var, $value) = explode('=', $part, 2);
$uvar = urldecode($var);
if (isset($vars[$uvar])) {
if (!is_array($vars[$uvar])) $vars[$uvar] = array($vars[$uvar]);
$vars[$uvar][] = urldecode($value);
} else {
$vars[$uvar] = urldecode($value);
}
}
print_r($vars);
Выводит:
Array
(
[a] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[b] => 1
)
Просто замените $q
на $_SERVER['QUERY_STRING']
.
Комментарии:
1. Да, true 1. Декодирование URL-адреса — хорошая идея. Но почему вы предпочли бы
raw
вариант? Должны лизнаки работать в параметрах url?
2. @mario: Хех, ты прав, исправил это, спасибо. У меня просто есть привычка использовать,
rawurlencode
поэтому я использовалrawurldecode
там, не замечая. 🙂3. Название функции делает его более полезным. Вам всегда придется заглядывать в руководство, чтобы узнать, что оно на самом деле делает .. ;} PHP нах