PHP 7.1+ 多维数组赋值报Cannot use string offset as an array问题咨询
PHP 7.1+ 多维数组赋值报错原因
该Cannot use string offset as an array报错触发的核心原因是PHP 7.1+收紧了字符串偏移访问的限制:低版本PHP中如果对标量(尤其是字符串)类型的变量使用数组维度赋值,会静默完成隐式类型转换,7.1+版本后该操作会直接抛出致命错误。
问题的根源并非$article['object']['manual']未初始化,而是更高层级的$article['object']在代码运行过程中被意外赋值为字符串/数字等标量类型,此时哪怕单独初始化子级manual维度,访问父级的数组下标依然会触发报错。
正确实现方案
方案1:提前完整初始化所有维度
在执行赋值逻辑前,从最外层开始逐层级初始化所有需要用到的数组维度,保证每一级父元素均为数组类型:
// 逐层级初始化,避免父级为标量 $article = []; $article['object'] = []; $article['object']['manual'] = []; // 执行原有赋值逻辑 if ($result['type']>0) { $article['object']['type'] = $result['type']; } if (strlen($result['productName'])>0) { $article['object']['manual']['product'] = $result['productName']; } if (strlen($result['brandName'])>0) { $article['object']['manual']['brand'] = $result['brandName']; }
方案2:赋值前强制校验父级类型
如果无法确定前置代码是否修改过父级元素的类型,可以在赋值前增加校验逻辑,强制将父级转换为数组:
// 校验并修复父级维度类型 $article['object'] = $article['object'] ?? []; if (!is_array($article['object'])) { $article['object'] = []; } $article['object']['manual'] = $article['object']['manual'] ?? []; if (!is_array($article['object']['manual'])) { $article['object']['manual'] = []; }
注意事项
- 不要跳过父级维度单独初始化子级,该操作无法修复父级为标量的问题
- 排查
$article['object']相关的其他赋值逻辑,避免其被意外覆盖为标量类型
内容的提问来源于stack exchange,提问作者Mad Marvin
相关产品推荐
相关产品推荐

