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

यह वही करना चाहिए जो आप चाहते हैं, मेरे पास एक एपीआई थी जिसे एक ही चीज़ की आवश्यकता थी।

$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

धन्यवाद! मेलगुन एपीआई को संदेशों को बैच भेजने के लिए इसकी आवश्यकता होती है। –

+0

धन्यवाद जेसन। यह Google Adsens API – Florin

0

यहां एक ऐसा फ़ंक्शन है जिसे मैंने क्वेरी बनाने और नामों को संरक्षित करने के लिए बनाया है। मैंने इसे तीसरे पक्ष के एपीआई के साथ काम करने के लिए बनाया है जिसके लिए एक ही नाम के साथ कई क्वेरी स्ट्रिंग पैरामीटर की आवश्यकता है। जेसन का समाधान अच्छा है लेकिन ब्रैकेट को हटाने के लिए मुझे रेगेक्स का उपयोग करने में असहज महसूस हुआ।

मैंने कार्यान्वयन को 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); 
} 
संबंधित मुद्दे