#php #arrays #http #curl #urlencode
#php #массивы #http #curl #urlencode
Вопрос:
У меня есть PHP-сервис, который извлекает данные POST из клиента следующим образом:
if($_POST['data']) {
$uid = $_POST['data'][0];
$cid = $_POST['data'][1];
// ...
}
Клиент отправляет POST-данные в кодировке URL следующим образом:
'data[]=58amp;data[]=17'
Клиентский Javascript передает массив для формирования указанной выше строки:
var data = [58,17];
Сейчас я пишу другой PHP-скрипт, в котором я хочу вызвать прежнюю службу из PHP, используя cURL. Однако следующие попытки правильно закодировать URL-адрес этого простого массива не создают формат, который, как я знаю, отправляет клиент:
// Valid, expected URL encoded result
echo "<pre>data[]=58amp;data[]=17</pre>";
// User-submitted function from PHP.net
// that's supposed to do it right, but doesn't
function cr_post($a, $b = '', $c = 0) {
if (!is_array($a)) return false;
foreach ((array)$a as $k=>$v) {
if($c) {
if(is_numeric($k)) {
$k = $b."[]";
} else {
$k = $b."[$k]";
}
} else if (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("amp;",$r);
}
echo '<pre>'.cr_post(array(58,17)).'</pre>'; // Outputs '0=58amp;1=17' incorrectly
// Another attempt
$data = array(58,17);
$query = http_build_query($data);
$query = preg_replace('/[[0-9] ]/simU', '[]', $query);
echo '<pre>'.$query.'</pre>'; // Outputs '0=58amp;1=17' incorrectly
Есть ли лучший или более простой способ сделать это? Что не так с моим подходом?
Ответ №1:
Вы были близки ко второй попытке:
$data = array(58,17);
//equivalent to $string = 'data[0]=58amp;data[1]=17';
$string = http_build_query(array('data' => $data));
Вы могли бы удалить эти числовые индексы с помощью preg_replace, но я бы попробовал, если это сначала что-нибудь изменит.
Комментарии:
1. Спасибо, что указали мне правильное направление. Перенос $ data в другой массив правильно кодирует имя массива, но не удаляет числовые индексы в скобках. Итак, я использовал либо preg_replace, либо функцию cr_post в моем исходном сообщении, чтобы правильно закодировать выходные данные.