2011-11-17 33 views
18

¿Hay alguna forma de generar una consulta automáticamente con http_build_query usando parámetros con el mismo nombre?http_build_query con los mismos parámetros de nombre

Si hago algo así como

array('foo' => 'x', 'foo' => 'y'); 

Ellos son sobrescritos obviamente dentro de la matriz, pero incluso si lo hago:

array('foo' => array('x', 'y')); 

la función crea algo así como foo[0]=x&foo[1], que no es lo que quiero, ya que necesito los parámetros en este formato foo=x&foo=y.

Respuesta

31

Esto debería hacer lo que quiera, tuve una API que requería lo mismo.

$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 
+0

Brilliant! Justo lo que necesitaba, ¡gracias! – alexleonard

+1

Gracias! La API de mailgun requiere esto para el envío por lotes de mensajes. –

+0

Gracias Jason. Eso es muy útil en Google Adsens API – Florin

0

Aquí hay una función que creé para crear la consulta y conservar los nombres. Creé esto para trabajar con una API de terceros que requiere múltiples parámetros de cadena de consulta con el mismo nombre. La solución de Jason es agradable, pero me sentí incómodo con el uso de expresiones regulares para eliminar los soportes.

He intentado hacer la implementación igual que http_build_query. La única diferencia es que no toma el último parámetro $enc_type. La codificación se realiza mediante urlencode() que debe ser PHP_QUERY_RFC1738, el valor predeterminado para el tipo de codificación 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); 
} 
Cuestiones relacionadas