php url-запрос вложенного массива без индекса

Я работаю с сторонним API, который получает несколько параметров, которые должны быть закодированы следующим образом:

text[]=Hello%20World&text[]=How%20are%20you?&html[]=<p>Just%20fine,%20thank%20you</p> 

Как вы можете видеть, этот API может принимать несколько параметров для текста, а также для HTML (не в образце вызова).

Я использовал http_build_query для правильной сборки строки запроса для других API

 $params['text'][] = 'Hello World'; $params['text'][] = 'How are you?'; $params['html'][] = '<p>Just fine, thank you</p>'; $http_query = http_build_query($params); 

Проблема с этим подходом заключается в том, что он построит строку запроса с числовым индексом:

text[0]=Hello%20World&text[1]=How%20are%20you?&html[0]=<p>Just%20fine,%20thank%20you</p>

к сожалению, API, с которым я работаю, не любит числовой индекс и терпит неудачу.

Есть ли какая-либо функция php / class-method, которая может помочь мне быстро построить такой запрос?

спасибо

Кажется, что нет способа сделать это с помощью http_build_query . Сожалею. Однако на странице документов у кого-то есть:

 function cr_post($a,$b=0,$c=0){ if (!is_array($a)) return false; foreach ((array)$a as $k=>$v){ if ($c) $k=$b."[]"; elseif (is_int($k)) $k=$b.$k; if (is_array($v)||is_object($v)) { $r[]=cr_post($v,$k,1);continue; } $r[]=urlencode($k)."=" .urlencode($v); } return implode("&",$r); } $params['text'][] = 'Hello World'; $params['text'][] = 'How are you?'; $params['html'][] = '<p>Just fine, thank you</p>'; $str = cr_post($params); echo $str; 

Я его не тестировал. Если это не сработает, вам придется сворачивать самостоятельно. Возможно, вы можете опубликовать github gist, чтобы другие люди могли его использовать!

Я не знаю стандартного способа сделать это (я думаю, что нет такого способа), но вот уродливое решение:

Поскольку [] кодируется http_build_query , вы можете сгенерировать строку с индексами, а затем заменить их.

 preg_replace('/(%5B)\d+(%5D=)/i', '$1$2', http_build_query($params)); 

Я очень согласен с ответом RiaD, но вы можете столкнуться с некоторыми проблемами с этим кодом (извините, я не могу просто сделать это замечанием из-за отсутствия репутации).

Прежде всего, насколько я знаю, http_build_query возвращает строку urlencode () 'd, что означает, что у вас не будет [и], но вместо этого вы будете иметь% 5B и% 5D.

Во-вторых, механизм PCRE от PHP распознает символ «[» как начало символьного класса, а не просто как «[» ( метасимволы PCRE ). Это может привести к замене всех цифр с вашего запроса на «[]».

Скорее всего, вы захотите что-то вроде этого:

 preg_replace('/\%5B\d+\%5D/', '%5B%5D', http_build_query($params)); 

В этом случае вам нужно будет избежать% символов, поскольку они также имеют особое значение. Если у вас есть строка с фактическими скобками вместо экранов, попробуйте следующее:

 preg_replace('/\[\d+\]/', '[]', $http_query); 

Попробуй это:

 $params['text'][] = 'Hello World'; $params['text'][] = 'How are you?'; $params['html'][] = '<p>Just fine, thank you</p>'; foreach ($params as $key => $value) { foreach ($value as $key2 => $value2) { $http_query.= $key . "[]=" . $value2 . "&"; } } $http_query = substr($http_query, 0, strlen($http_query)-1); // remove the last '&' $http_query = str_replace(" ", "%20", $http_query); // manually encode spaces echo $http_query;