PHP中使用CURL传递数组失败,接收端仅获"Array"字符串?
问题分析与解决方案
嘿,我一眼就看出问题所在了——你用curl POST嵌套数组的方式不对,导致接收端无法正确解析内层数组!
为什么会得到string(5) "Array"?
当你给CURLOPT_POSTFIELDS传入包含嵌套数组的$post时,PHP会默认把数据编码成application/x-www-form-urlencoded格式(也就是普通表单提交的格式)。但这种格式不支持嵌套数组,PHP会直接把内层的$items数组转成字符串"Array",这就是你接收端看到的结果。
两种解决方案
方案一:用JSON格式传输(推荐,适合复杂数据结构)
JSON是处理嵌套数据的标准格式,能完美保留数组结构:
发送端代码修改:
$items[] = array("sku"=>"data","name"=>"data","amount"=>0,"qty"=>"0","id"=>"data","price"=>0,"url"=>"data"); $post = array( 'data' => 'data', 'items' => $items); // 将数组转为JSON字符串 $postJson = json_encode($post); $ch = curl_init('urltopost'); curl_setopt($ch, CURLOPT_POST, true); // 传入JSON字符串作为POST内容 curl_setopt($ch, CURLOPT_POSTFIELDS, $postJson); // 设置请求头为JSON格式 curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_TIMEOUT, 3); header('Content-Type: text/html'); $response = curl_exec($ch); echo $response; // 检查错误 if(curl_errno($ch)) { header('Location: error'); die(); } // 别忘了关闭curl资源,避免泄漏 curl_close($ch);
接收端代码修改:
因为$_POST只处理表单编码的数据,所以要读取原始请求体并解析JSON:
$postData = json_decode(file_get_contents('php://input'), true); var_dump($postData["items"]); // 现在就能正确输出嵌套数组了
方案二:用http_build_query处理数组(仅适合简单嵌套场景)
如果一定要用表单编码格式,可以用http_build_query把数组转成符合表单规范的字符串,接收端就能正确解析为数组:
发送端修改:
// 把$post数组转成表单编码字符串 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
接收端无需修改,直接用var_dump($_POST["items"])就能拿到正确的数组。不过这种方式对多层嵌套的复杂数组支持有限,不如JSON可靠。
内容的提问来源于stack exchange,提问作者HTMLGuru
相关产品推荐
相关产品推荐

