Я работаю с сторонним 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;