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

감사합니다. Jason. Google Adsens API – Florin

0

다음은 쿼리를 작성하고 이름을 보존하기 위해 만든 함수입니다. 동일한 이름의 여러 쿼리 문자열 매개 변수가 필요한 제 3 자 API를 사용하기 위해이 API를 만들었습니다. Jason의 솔루션은 좋지만 방금 정규식을 사용하여 대괄호를 제거하는 것이 불편했습니다.

구현을 http_build_query과 동일하게 만들려고했습니다. 유일한 차이점은 마지막 $enc_type 매개 변수를 사용하지 않는다는 것입니다. 인코딩은 PHP_QUERY_RFC1738해야하는 urlencode()를 사용하여 수행됩니다, 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); 
} 
관련 문제