2011-11-17 19 views
18

C'è un modo per creare una query automaticamente con http_build_query utilizzando i parametri con lo stesso nome?http_build_query con gli stessi parametri nome

Se faccio qualcosa di simile

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

Sono ovviamente sovrascritti all'interno della matrice, ma anche se lo faccio:

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

la funzione crea qualcosa di simile foo[0]=x&foo[1], che non è quello che ho voglio, dal momento che ho bisogno dei parametri in questo formato foo=x&foo=y.

risposta

31

Questo dovrebbe fare quello che vuoi, ho avuto un API che ha richiesto la stessa cosa.

$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! Proprio quello di cui avevo bisogno, grazie! – alexleonard

+1

Grazie! L'API mailgun richiede questo per l'invio batch di messaggi. –

+0

Grazie Jason. È molto utile sull'API di Google Adsens – Florin

0

Ecco una funzione che ho creato per creare la query e conservare i nomi. L'ho creato per funzionare con un'API di terze parti che richiede più parametri di stringa di query con lo stesso nome. La soluzione di Jason è carina, ma mi sono appena sentito a disagio nell'usare regex per rimuovere le parentesi.

Ho cercato di rendere l'implementazione uguale a http_build_query. L'unica differenza è che non prende l'ultimo parametro $enc_type. La codifica viene fatto usando urlencode() che dovrebbe essere PHP_QUERY_RFC1738, il tipo di codifica predefinito per 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); 
} 
Problemi correlati