PHP(CI)cURL传递的多维数组的行为与一个数组不同(可以';t循环它)

PHP(CI)cURL传递的多维数组的行为与一个数组不同(可以';t循环它),php,post,curl,encoding,multidimensional-array,Php,Post,Curl,Encoding,Multidimensional Array,当从POST cURL请求接收参数时,我遇到了一个extrange问题。无论我在发布之前如何编码(json、url、rawurl、utf8、base64…),我都无法通过循环通过数组元素执行任何解码操作。我会告诉你细节的 从消费控制器,在其他一些php(Yii)应用程序中,我构建了如下请求: private function callTheApi($options) { $url = "http://api.call.com/url/api"; $params = array(

当从POST cURL请求接收参数时,我遇到了一个extrange问题。无论我在发布之前如何编码(json、url、rawurl、utf8、base64…),我都无法通过循环通过数组元素执行任何解码操作。我会告诉你细节的

从消费控制器,在其他一些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中有$keys数组,我可以随心所欲地使用它。“echo json_encode($keys)”语句返回的数组几乎与它应该返回的一样。但问题是数组的某些值在cURL操作中被损坏。西班牙语字符á、é、í、ó、ú或ü等值根本不存在于数组_值中

如果$keys数组中的某个键是原始数组中的西班牙语单词“alimentación”,那么一旦它被卷曲到api中,它就会变成“alimentacin”。在那里,太阳不再存在了

所以,我的机会是将数组中的每个值编码为一个安全传输的值,以便稍后对其进行解码。但是你知道什么,我不能

我尝试过urlencoding、rawurlencoding、json_编码、base64_编码。。。数组的每个值。如果我从api返回接收到的数组,它包含编码的值。但是

如果我在api中循环数组进行解码,然后尝试返回它,无论我对其值应用什么解码函数,输出总是“NULL”

我不知道我做错了什么。甚至不接近。
因此,任何帮助都将不胜感激。社区,请提前感谢。

当您创建cUrl参数数组时,您应该知道键不能是utf8

当您在foreach循环中添加一些参数时

$params['keys[' . $id . ']'] = $name;
$id可以是utf8字符

为了避免这种情况,我建议您使用json_编码

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

在您的api中,在这种情况下,您不应更改任何内容。

感谢您花时间回答。我不能
json\u编码($options['keys']
因为,正如我所说,数组包含一些非utf8字符。所以我首先循环数组,
utf8\u编码
每个值,然后在发布之前使用您的解决方案和
json\u编码
。然后,在接收端,我有同样的问题。循环数组进行utf8\u解码返回
NULL
。顺便说一下,同样的事情如果我使用urlencode/decode而不是utf8,则会发生以下情况:(
$params = array(    
    'api_key' => $this->api_key,
    'domain' => $this->domain,
    'date' => $options['date'],
    'keys' => json_encode($options['keys']) // This is an array
);