PHP数组遍历报错Illegal string offset 'day'求助排查
解决PHP遍历数组时的"Illegal string offset 'day'"错误
这个错误Illegal string offset 'day'的本质很明确:在某次循环迭代中,你以为是数组的$open其实是一个字符串。当你尝试用数组键(比如'day')去访问字符串时,PHP会把键名转换成整数(这里'day'会被转成0),试图取字符串的第0个字符,但这种用法不符合你的预期,所以抛出了错误。
为什么print_r($open)看起来正常?
你看到的print_r($open)输出正确,说明只有部分迭代的$open是数组,至少有一次迭代中$open变成了字符串。可能的原因包括:
- 你的
$shops数组中,某个店铺的open字段不是数组,而是被误赋值为字符串(比如空字符串、"Monday"这类文本); $shop['open']数组里混入了非数组元素(比如某个元素直接存了日期字符串,而不是['day' => ...]的关联数组);- 遍历前的代码不小心修改了
$shops数组,导致open的元素被强制转换成了字符串。
解决方案:定位问题并修正数组结构
首先,在循环中添加类型检查,精准定位问题元素:
foreach($shops as $shop) { // 先验证店铺的open字段是否为数组 if (!is_array($shop['open'])) { echo "问题店铺ID {$shop['id']}:open字段不是数组,内容为:" . print_r($shop['open'], true) . "<br>"; continue; } foreach($shop['open'] as $index => $open) { // 验证每个open条目是否为数组 if (!is_array($open)) { echo "索引{$index}的open条目异常:不是数组,内容为:" . print_r($open, true) . "<br>"; continue; } print_r($open); echo $open['day']; } }
运行这段代码后,你会看到具体哪个元素出了问题,接下来只需要修正$shops数组的结构,确保:
- 每个店铺的
open字段都是数组; open数组内的每个元素都是包含day、start、end键的关联数组。
内容的提问来源于stack exchange,提问作者xylar
相关产品推荐
相关产品推荐

