2011-11-17 15 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

ブリリアントのデフォルトのエンコードタイプでなければなりませんurlencode()を使用して行われます!ちょうど私が必要なもの、ありがとう! – alexleonard

+1

ありがとう! mailgun APIは、メッセージのバッチ送信にこれを必要とします。 –

+0

ありがとうございました。 Google Adsens API – Florin

0

ここでは、クエリを作成して名前を保存するために作成した関数です。私は同じ名前の複数のクエリ文字列パラメータを必要とするサードパーティのAPIで動作するようにこれを作成しました。ジェイソンの解決策はいいですが、私はちょうど大括弧を削除するために正規表現を使用すると不快感を感じた。

私は実装をhttp_build_queryと同じにしようとしました。唯一の違いは、最後の$enc_typeパラメータを取らないことです。エンコーディングはPHP_QUERY_RFC1738http_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); 
} 
関連する問題