Есть ли способ создать запрос автоматически с помощью http_build_query
с использованием параметров с именем?
Если я сделаю что-то вроде
array('foo' => 'x', 'foo' => 'y');
Они явно перезаписываются внутри массива, но даже если я это делаю:
array('foo' => array('x', 'y'));
Функция создает что-то вроде foo[0]=x&foo[1]
, чего я не хочу, так как мне нужно что-то foo=x&foo=y
.
Это должно делать то, что вы хотите, у меня был 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
Вот функция, которую я создал для создания запроса и сохранения имен. Я создал это для работы с сторонним 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); }