передача ассоциативного массива $_GET без [] в URL (очень короткий вопрос PHP)

#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 нах