Как мне заставить PHP правильно кодировать URL-адреса в численно индексированном массиве?

#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 в моем исходном сообщении, чтобы правильно закодировать выходные данные.