Как отправить многомерный массив с PHP cURL без ключей массива из вложенных массивов? - PullRequest
1 голос
/ 25 октября 2019

Введение

Поэтому я пытаюсь отправить значения формы в виде строки запроса в API. API ожидает строку запроса, подобную этой:

&name=Charles+Hansen&email=example@email.com&locations=23433&locations=23231&propertyTypes=APARTMENT&propertyTypes=TOWNHOUSE&message=test"

Как вы можете видеть, существует несколько «propertyTypes» и «location» в зависимости от того, сколько типов свойств или местоположений пользователь выбирает в форме. Из-за этого я сохранил все данные $ _POST в многомерном массиве, который выглядит следующим образом, поскольку у меня, очевидно, не может быть нескольких ключей с одинаковыми именами "propertyTypes" или "location":

Array
(
    [name] => Charles Hansen
    [email] => example@email.com
    [locations] => Array
        (
            [0] => 23433
            [1] => 23231
        )
    [propertyTypes] => Array
        (
            [0] => APARTMENT
            [1] => TOWNHOUSE
        )
    [message] => test
)

cURLне поддерживает многомерные массивы, поэтому сначала я строю запрос сам, прежде чем его использовать. Это моя функция cURL:

function sg_order($post_fields) {
    if($post_fields) {
        $query = http_build_query($post_fields);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'https://example.com/order?orgKey=' . constant('ORG_KEY'));
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
          'Content-Type: application/x-www-form-urlencoded',                 
          'Content-Length: ' . strlen($query))
        );
        $result = curl_exec($ch);

        $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        if(curl_errno($ch)) {
          error_log('Curl error: ' . curl_error($ch) . $result);
        }else{
          error_log('Curl response: ' . $status);
        }
        curl_close($ch);

        return $result;
    }
}

orgKey - обязательный параметр для проверки.

Проблема

Моя проблема в том, чтозапрос, построенный с помощью $query = http_build_query($post_fields);, содержит ключи для вложенных массивов ([0], [1] и т. д.). Результат $query выглядит следующим образом:

&name=Charles+Hansen&email=example@email.com&locations[0]=23433&locations[1]=23231&propertyTypes[0]=APARTMENT&propertyTypes[1]=TOWNHOUSE&message=test"

Как избавиться от ключей ([0], [1] и т. Д.), Чтобы запрос выглядел в точности так, как ожидает API?

Дополнительная информация

  • У меня нет контроля над API
  • Я не отправляю файлы, поэтому решение не должно работатьс файлами

1 Ответ

2 голосов
/ 25 октября 2019

Если вы не хотите писать свою собственную версию http_build_query, я бы посоветовал вам изменить версию из этого комментария пользователя в руководстве: http://php.net/manual/en/function.http-build-query.php#111819

    $query = http_build_query($query);
    $query = preg_replace('/%5B[0-9]+%5D/simU', '%5B%5D', $query);

Они заменяют foo[xy] с foo[] здесь - поскольку вы не хотите сохранять [], просто замените '%5B%5D' в вызове preg_replace на пустую строку.

...