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


165

Я шукаю ім'я функції PHP для створення рядка запиту з масиву пар ключових значень. Зауважте, я шукаю вбудовану функцію PHP для цього, а не домашню (це все, що пошук у Google, здається, повертається). Є один, я просто не можу згадати його ім'я або знайти його на php.net. Ім'я IIRC не таке інтуїтивне.

Відповіді:


312

Ви шукаєте http_build_query().


Це зовсім нова функція, доступна на PHP 5.
Calmarius

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відповіді 's.
Більш сумісна версія 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, який вимагає як ключів, так і значень з масиву, імплод не може цього зробити.
Робін Барнс

2
Я бачу, не був впевнений, чи ви мали на увазі рядок запитів SQL чи рядок запиту http.
Клацніть Оновити
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.