You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP代码使用foreach时出现Illegal string offset错误求助

问题原因分析与修复方案

首先,你遇到的Illegal string offset错误,核心原因是你直接在字符串上执行了数组式的访问操作——curl_exec($ch)返回的是API响应的JSON字符串,而不是PHP数组,当你用foreach遍历这个字符串时,PHP会把它拆成单个字符的数组,每个字符是一个字符串,这时你尝试访问$value['campaigns'],就相当于在单个字符(比如{、"这类)上用数组键,自然会报错。

接下来梳理你代码里的几个关键问题:

1. 错误的请求逻辑与参数处理

你把API的URL赋值给$data后,又用json_encode($data)把URL字符串转成了JSON,这完全不符合API的请求要求——从URL的结构看,这个API应该是GET请求(参数都在URL的查询串里),但你却设置了CURLOPT_POST = 1,还把转错的JSON作为POST字段发送,这会导致API返回的内容不是你预期的结构化数据,甚至可能是错误响应。

2. 未将JSON响应转为PHP数组

即使API返回了正确的JSON,你也没有用json_decode()把它转换成PHP可以遍历的数组/对象,直接遍历字符串必然出错。

修复后的完整代码

<table>
<tr>
<?php
// 1. 直接定义API的GET请求URL,不需要额外处理
$apiUrl = 'https://www.example.com/api/report_advertiser?key=abcd&campaigns=6757955,6781745,6739793,6349821&quick=last_month';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
// 2. 因为是GET请求,不需要设置POST相关选项
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 可选:添加User-Agent等请求头,模拟浏览器请求
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36');

$response = curl_exec($ch);
// 3. 检查curl请求是否成功
if(curl_errno($ch)){
    echo 'CURL Error: ' . curl_error($ch);
}
curl_close($ch);

// 4. 将JSON响应转为关联数组
$responseData = json_decode($response, true);

// 5. 先检查转换是否成功,再遍历
if(is_array($responseData)){
    foreach ($responseData as $value) {
        // 确保$value是数组且存在campaigns键,避免报错
        if(isset($value['campaigns'])){
            echo $value['campaigns'] . '<br>';
        }
    }
} else {
    echo 'Invalid API response or JSON parse failed';
}
?>
</tr>
</table>

额外注意事项

  • 始终检查json_decode()的返回值:如果API返回的不是合法JSON,json_decode()会返回null,提前判断可以避免后续报错。
  • 检查curl请求的错误:用curl_errno()和curl_error()排查请求是否成功发送。
  • 根据API文档确认请求方法:如果确实需要POST请求,你需要把参数整理成数组再转JSON,而不是把URL转成JSON。

内容的提问来源于stack exchange,提问作者ManiacSnail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:32:30