使用cURL PHP POST一个多维数组的问题

4
我有一个问题,需要使用PHP cURL发布数组。我已经成功地使用POST变量将其他值发布到同一页。但是这个问题很难解决。唯一的问题是我应该如何向服务器呈现数据。
我使用表单分析器检查了原始表单。表单分析器显示POST变量是这样发送的:
array fundDistribution' => 
     array
        204891 => '20' (length=2)
        354290 => '20' (length=2)
        776401 => '20' (length=2)
        834788 => '40' (length=2)

这里的数值仅为示例,但它们将具有相同的长度。

我的问题是当我像这样发送数值时,响应服务器无法识别它们:

Array(
[104786] => 20
[354290] => 20
[865063] => 20
[204891] => 20
[834788] => 20)

我的问题是:我如何发送数据,以便服务器能够理解它?
谢谢!

你没有展示数据是从哪里来的以及它是如何呈现出你在第二个例子中展示的奇怪形状的,因此无法提供建议来改变它。 - Pekka
抱歉,我已经编辑了原帖。 - Christopher
还需要更多的代码!告诉我们这个数组在哪里定义以及您发送数据的 cURL PHP 函数。 - chigley
类似的帖子对我有用。我还没有尝试Wrikken在这里的答案。 - machineaddict
4个回答

3
function flatten_GP_array(array $var,$prefix = false){
        $return = array();
        foreach($var as $idx => $value){
                if(is_scalar($value)){
                        if($prefix){
                                $return[$prefix.'['.$idx.']'] = $value;
                        } else {
                                $return[$idx] = $value;
                        }
                } else {
                        $return = array_merge($return,flatten_GP_array($value,$prefix ? $prefix.'['.$idx.']' : $idx));
                }
        }
        return $return;
}
//...
curl_setopt($ch, CURLOPT_POSTFIELDS,flatten_GP_array($array));

谢谢,我应该使用什么前缀?"&" 还是 "fundDistribution"? - Christopher
不,一开始不要给前缀,只需将第二个参数省略即可。它仅用于递归设置。但我希望您发送一个 array('fundDistribution'=>array(...rest..)); 作为输入。 - Wrikken
是的,我得到了类似这样的东西:数组 ( [fundDistribution[104786]] => 20 ... ) - Christopher
嗯,那个措辞可能不太准确。"I do expect you to" => "我期望你会" ;) - Wrikken
我找到了问题所在,他们使用JavaScript cookie来传递参数...真的很愚蠢,但我应该能够找到一个解决方法。 - Christopher
显示剩余2条评论

3
正如Sepehr Lajevardi所说,您应该使用:
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($your_array));

0

你需要将post设置为true。然后可以在POSTFIELDS选项中传递关联数组,如下所示。

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $your_array);

谢谢你的回答!我设置了很多选项。其中,你提到的选项也已经设置好了。 - Christopher
将数组传递给CURLOPT_POSTFIELDS会稍微改变cURL的行为。它将以多种形式/后数据发送数据,并将带有以“@”开头的值的任何参数视为文件名。 - bobdiaes

0

试试这个:

function postVars($vars,$sep='&') {
    $str = '';
    foreach( $vars as $k => $v) {
        if(is_array($v)) {
            foreach($v as $vk=>$vi) {
                $str .= urlencode($k).'['.$vk.']'.'='.urlencode($vi).$sep;
            }
        } else {
            $str .= urlencode($k).'='.urlencode($v).$sep;
        }
    }
    return substr($str, 0, -1);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接