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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
173
0
156 359
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

Robin Barnes 30.12.2008 20:00

Я вижу, не был уверен, имели ли вы в виду строку запроса SQL или строку запроса HTTP.

Click Upvote 31.12.2008 00:05
Ответ принят как подходящий

Вы ищете http_build_query().

Это совершенно новая функция, доступная с PHP 5.

Calmarius 04.07.2012 22:32

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

cb0 13.08.2014 17:06

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

TJ L 05.08.2016 20:28

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

Andrew 30.11.2016 22:56

Вот простая реализация, совместимая с 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 );

}

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

cloudfeet 01.08.2013 19:38

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

0x6A75616E 01.08.2013 21:35

Как дополнение к ответу @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);
    }
}

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

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

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

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

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

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

Другие вопросы по теме