Http_build_query с теми же параметрами имени
Есть ли способ автоматически создать запрос с помощью http_build_query
с использованием параметров с именем?
Если я что-то вроде
array('foo' => 'x', 'foo' => 'y');
Они явно перезаписываются внутри массива, но даже если я это делаю:
array('foo' => array('x', 'y'));
Функция создает что-то вроде foo[0]=x&foo[1]
, чего я не хочу, так как мне нужно что-то foo=x&foo=y
.
Ответы
Ответ 1
Это должно делать то, что вы хотите, у меня был api, который требовал того же самого.
$vars = array('foo' => array('x','y'));
$query = http_build_query($vars, null, '&');
$string = preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '=', $query); //foo=x&foo=y
Ответ 2
Вот функция, которую я создал для создания запроса и сохранения имен. Я создал это для работы с сторонним API, который требует нескольких параметров строки запроса с тем же именем. Решение Джейсона приятно, но мне просто стало неудобно использовать регулярное выражение для удаления скобок.
Я попытался сделать реализацию такой же, как http_build_query
. Единственное отличие состоит в том, что он не принимает последний параметр $enc_type
. Кодирование выполняется с помощью urlencode()
, который должен быть PHP_QUERY_RFC1738
, тип кодировки по умолчанию для http_build_query()
function http_build_query_same_names($query_data, $numeric_prefix = null, $arg_separator = null) {
if (!is_object($query_data) && !is_array($query_data)) {
trigger_error( __FUNCTION__ . "(): Parameter 1 expected to be Array or Object. Incorrect value given", E_USER_WARNING);
return false;
}
$query_data = is_object($query_data) ? get_object_vars($query_data) : $query_data;
$numeric_prefix = isset($numeric_prefix) ? $numeric_prefix : '';
$arg_separator = isset($arg_separator) ? $arg_separator : ini_get('arg_separator.output');
$final = array();
foreach ($query_data as $name => $value) {
$name = is_numeric($name) ? $numeric_prefix . $name : $name;
if (is_array($value)) {
array_walk_recursive($value, function($value, $key, $name) use (&$final) {
$final[] = urlencode($name) . '=' . urlencode($value);
}, $name);
}
else {
$final[] = urlencode($name) . '=' . urlencode($value);
}
}
return implode($arg_separator, $final);
}