PHP (CI) cURL передал многомерный массив не ведет себя как один (не может его зацикливать)

У меня возникает проблема с расширением при получении параметров из запроса POST cURL. Независимо от того, как я его кодирую (json, url, rawurl, utf8, base64 …) перед отправкой POSTing, я не могу выполнять какую-либо операцию декодирования через элементы массива через цикл. Я расскажу вам подробности.

Из контроллера потребления в другом приложении php (Yii) я создаю свой запрос следующим образом:

private function callTheApi($options) { $url = "http://api.call.com/url/api"; $params = array( 'api_key' => $this->api_key, 'domain' => $this->domain, 'date' => $options['date'], 'keys' => $options['keys'] // This is an array ); // Following some good advice from Daniel Vandersluis here: // http://stackoverflow.com/questions/3772096/posting-multidimensional-array-with-php-and-curl if (is_array($params['keys']) { foreach ($params['keys'] as $id => $name) { $params['keys[' . $id . ']'] = $name; } unset($params['keys']); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: multipart/form-data; charset=utf-8')); curl_setopt($ch, CURLOPT_TIMEOUT, 120); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.0; en; rv:1.9.0.4) " . "Gecko/2009011913 Firefox/3.0.6"); $output = curl_exec($ch); $error = curl_errno($ch); $error_text = curl_error($ch); curl_close($ch); if (!$output || $error != 0) die("<br><hr>Problems...<br>" . "Line:" . __LINE__ . " dataExtractor.php<br>" . "Error: " . $error . " - " . $error_text . "<hr>" . $url . "<hr>"); sleep(1); return json_decode($output, true); } 

И в самом api это функция:

 public function api() { $params = $_POST; foreach($params as $k=>$v){ if($k=='domain') $domain = $v; if($k=='date') $date = $v; if($k=='api_key') $api_key = $v; if($k=='keys') $keys = $v; } echo json_encode($keys); // All my logic would be here, after parsing the array correctly. } 

Хорошо, теперь для проблем:

Если я оставлю все, как указано ранее, он работает. У меня есть массив $ keys в api, и я могу использовать его, но я хочу. Предложение echo json_encode ($ keys) возвращает массив ALMOST, как и должно быть. Но проблема в том, что некоторые значения массива повреждены в операции cURL. Значения, такие как испанские символы á, é, í, ó, ú OR ü, просто отсутствуют в массиве_значений.

Если какой-либо ключ в массиве $ keys был испанским словом «alimentación» в исходном массиве, как только он был cURLed для api, он становится «alimentacin». Там больше нет.

Таким образом, мои шансы кодируют каждое значение в массиве до безопасного переданного значения, поэтому я могу его декодировать позже. Но что вы знаете, я не могу.

Я пробовал urlencoding, rawurlencoding, json_encoding, base64_encoding … каждое значение массива. И если я верну полученный массив из api, он будет содержать закодированные значения. НО.

Если я зациклирую массив в api для декодирования, а затем попытаюсь вернуть его, независимо от того, какую функцию декодирования я применяю к его значениям, выход ALWAYS «NULL».

Я понятия не имею, что я здесь делаю неправильно. Даже не близко. Поэтому любая помощь была бы высоко оценена. Спасибо заранее, сообщество.

Когда вы создаете массив params cUrl, вы должны знать, что ключи не могут быть utf8.

И когда вы добавляете некоторые параметры в цикл foreach

 $params['keys[' . $id . ']'] = $name; 

$ id может быть символом utf8.

Чтобы избежать этого, я рекомендую вам использовать json_encode

 $params = array( 'api_key' => $this->api_key, 'domain' => $this->domain, 'date' => $options['date'], 'keys' => json_encode($options['keys']) // This is an array ); 

В вашем api в этом случае вы ничего не должны менять.