PHP функция для построения строки запроса из массива


165

Я ищу имя функции PHP для построения строки запроса из массива пар ключ-значение. Пожалуйста, обратите внимание, я ищу встроенную функцию PHP для этого, а не доморощенную (это все, что поиск в Google, кажется, возвращает). Есть один, я просто не могу вспомнить его имя или найти его на php.net. IIRC его имя не так интуитивно понятно.

Ответы:


312

Ты ищешь http_build_query().


Это довольно новая функция, доступная в PHP 5.
Кальмариус

15
Будьте осторожны с этой функцией! Он пропустит любую пару ключ-значение, где значение равно NULL. echo http_build_query(array("foo"=>"bar","bar"=>null))будет производить толькоfoo=bar
cb0

@ cb0 это работает аналогично отправке формы в браузере, пустое поле ввода не будет включено в отправленный запрос.
TJ L

1
@ceejayoz Ну, ты давно знаешь это ... Твое желание сбылось?
Андрей

21

Вот простая реализация с поддержкой php4:

/**
* Builds an http query string.
* @param array $query  // of key value pairs to be used in the query
* @return string       // http query string.
**/
function build_http_query( $query ){

    $query_array = array();

    foreach( $query as $key => $key_value ){

        $query_array[] = urlencode( $key ) . '=' . urlencode( $key_value );

    }

    return implode( '&', $query_array );

}

30
это версия php4.
0x6A75616E

1
При его декодировании PHP, кажется, также декодирует ключ в процентах. Возможно, стоит сделать это здесь?
Cloudfeet

@cloudfeet кажется разумным сделать это. Спасибо за указание на это.
0x6A75616E

2

Так же, как дополнение к @thatjuanответу.
Более совместимая версия PHP4 этого:

if (!function_exists('http_build_query')) {
    if (!defined('PHP_QUERY_RFC1738')) {
        define('PHP_QUERY_RFC1738', 1);
    }
    if (!defined('PHP_QUERY_RFC3986')) {
        define('PHP_QUERY_RFC3986', 2);
    }
    function http_build_query($query_data, $numeric_prefix = '', $arg_separator = '&', $enc_type = PHP_QUERY_RFC1738)
    {
        $data = array();
        foreach ($query_data as $key => $value) {
            if (is_numeric($key)) {
                $key = $numeric_prefix . $key;
            }
            if (is_scalar($value)) {
                $k = $enc_type == PHP_QUERY_RFC3986 ? urlencode($key) : rawurlencode($key);
                $v = $enc_type == PHP_QUERY_RFC3986 ? urlencode($value) : rawurlencode($value);
                $data[] = "$k=$v";
            } else {
                foreach ($value as $sub_k => $val) {
                    $k = "$key[$sub_k]";
                    $k = $enc_type == PHP_QUERY_RFC3986 ? urlencode($k) : rawurlencode($k);
                    $v = $enc_type == PHP_QUERY_RFC3986 ? urlencode($val) : rawurlencode($val);
                    $data[] = "$k=$v";
                }
            }
        }
        return implode($arg_separator, $data);
    }
}

-2

Поскольку этот вопрос довольно старый и для PHP, вот способ сделать это в (в настоящее время) очень популярной среде PHP Laravel.

Чтобы закодировать строку запроса для пути в вашем приложении, присвойте свои маршруты и затем используйте route()вспомогательную функцию следующим образом:

route('documents.list.', ['foo' => 'bar']);

Результат будет выглядеть примерно так:

http://localhost/documents/list?foo=bar

Также имейте в виду, что если у вашего маршрута есть какие-либо параметры сегмента пути, например /documents/{id}, убедитесь, что вы также передали idаргумент route()параметрам, иначе он по умолчанию будет использовать значение первого параметра.


-3

Implode объединит массив в строку для вас, но чтобы сделать SQL-запрос из пары kay / value, вам придется написать свою собственную функцию.


Пробовал, но это не сработает. Я пытаюсь создать строку запроса http, которая требует и ключи, и значения из массива, implode не может этого сделать.
Робин Барнс

2
Я вижу, не был уверен, имели ли вы в виду строку запроса SQL или строку запроса http.
Нажмите Upvote
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.