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






Взорвать объединит массив в строку для вас, но чтобы сделать SQL-запрос из пары kay / value, вам придется написать свою собственную функцию.
Я вижу, не был уверен, имели ли вы в виду строку запроса SQL или строку запроса HTTP.
Это совершенно новая функция, доступная с PHP 5.
Будьте осторожны с этой функцией! Он будет опускать любую пару "ключ-значение", значение которой равно NULL. echo http_build_query(array("foo"=>"bar","bar"=>null)) будет производить только foo=bar
@ cb0 это работает аналогично отправке формы в браузере, пустое поле ввода не будет включено в отправленный запрос.
@ceejayoz Ну ты давно это знаешь ... Твое желание сбылось?
Вот простая реализация, совместимая с 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 кажется разумным сделать это. Спасибо, что указали на это.
Как дополнение к ответу @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(), иначе по умолчанию будет использоваться значение первого параметра.
Пробовал, но это не сработает. Я пытаюсь создать строку HTTP-запроса, для которой требуются как ключи, так и значения из массива, implode не может этого сделать.