Подтвердить что ты не робот

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.

4b9b3361

Ответ 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);
}