Входной параметр $ _GET, который является массивом - PullRequest
2 голосов
/ 26 мая 2010

Я пытаюсь передать 3 параметра в скрипт, где 3-й параметр $_GET['value3'] должен быть массивом

$_GET['value1'] 
$_GET['value2'] 
$_GET['value3'] //an array of items

Я вызываю скрипт так: (обратите внимание на мой синтаксис для value3, я не уверен, что он правильный)

http://localhost/test.php?value1=test1&value2=test2&value3=[the, array, values]

Затем я использую foreach для циклического прохождения третьего параметра value3, который является массивом

//process the first input $_GET['value1']

//process the second input $_GET['value2']

//process the third input $_GET['value3'] which is the array
foreach($_GET['value3'] as $arrayitem){
    echo $arrayitem; 
}

но я получаю ошибку Invalid argument supplied for foreach()

Я не уверен, верна ли моя методология. Могут ли некоторые уточнить, как вы будете поступать таким образом

Ответы [ 6 ]

7 голосов
/ 26 мая 2010

Не существует такой вещи, как «передача массива в качестве параметра URL» (или значение формы, если на то пошло, потому что это одно и то же). Это строки, и все, что с ними происходит, кроме волшебства, встроенного в ваш сервер приложений, и, следовательно, непереносимого.

PHP поддерживает нотацию &value3[]=the&value3[]=array&value3[]=values для автоматического создания $_GET['value3'] как массива для вас, но это специально для PHP и не обязательно работает в других местах.

Вы также можете просто перейти к более чистому URL, например: value3=the,array,values, а затем использовать explode(',', $_GET['value3']) в своем скрипте PHP для создания массива. Конечно, это означает, что ваш символ-разделитель не может быть частью значения.

Чтобы однозначно транспортировать структурированные данные по HTTP, используйте формат, созданный для этой цели (а именно: JSON), а затем используйте json_decode() на стороне PHP.

7 голосов
/ 26 мая 2010

попробуй

http://localhost/test.php?value1=test1&value2=test2&value3[]=the&value3[]=array&value3[]=values
2 голосов
/ 26 мая 2010

Для массивов необходимо передать параметры запроса как

value3[]=abc&value3[]=pqr&value3[]=xyz
1 голос
/ 26 мая 2010

Вы можете также привести имя индекса в строку

?value1[a]=test1a&value1[b]=test1b&value2[c][]=test3a&value2[c][]=test3b

будет

$_GET['value1']['a'] = test1a
$_GET['value1']['b'] = test1b
$_GET['value2']['c'] = array( 'test3a', 'test3b' );
0 голосов
/ 26 мая 2010

http://php.net/manual/en/reserved.variables.get.php Проверьте ссылку выше. Вы увидите, как реализован метод GET. В результате получается, что URL берется, он разделяется с помощью '&', а затем они добавляются в виде пары ключ-значение.

   public function fixGet($args) {
    if(count($_GET) > 0) {
        if(!empty($args)) {
            $lastkey = "";
            $pairs = explode("&",$args);
            foreach($pairs as $pair) {
                if(strpos($pair,":") !== false) {
                    list($key,$value) = explode(":",$pair);
                    unset($_GET[$key]);
                    $lastkey = "&$key$value";
                } elseif(strpos($pair,"=") === false)
                    unset($_GET[$pair]);

                else {
                    list($key, $value) = explode("=",$pair);
                    $_GET[$key] = $value;
                }
            }
        }
        return "?".((count($_GET) > 0)?http_build_query($_GET).$lastkey:"");
    }

Поскольку они добавляются в виде пары ключ-значение, которую нельзя передать массивам в методе GET ...

0 голосов
/ 26 мая 2010

Следующее также будет работать:

http://localhost/test.php?value3[]=the&value3[]=array&value3[]=values

Более продвинутый подход - сериализовать массив PHP и напечатать его по вашей ссылке:

http://localhost/test.php?value3=a:3:{i:0;s:3:"the";i:1;s:5:"array";i:2;s:6:"values";}

, по сути, также будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...