2011-11-17 221 views
18

有沒有辦法使用同名的參數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

回答

31

這應該做你想做的,我有一個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 
+0

輝煌!正是我需要的,謝謝! – alexleonard

+1

謝謝! mailgun API需要此批量發送消息。 –

+0

謝謝傑森。這對Google Adsens API – Florin

0

這是我爲建立查詢和保留名稱而創建的函數。我創建了這個工具來處理需要多個查詢字符串參數並具有相同名稱的第三方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); 
}