PHP中如何动态遍历混合结构数组?解决遍历报错问题
解决PHP混合数组遍历的"Attempt to read property 'title' on string"错误
报错原因
你的混合数组里同时存在字符串类型的关联值($array['title']、$array['des'])和数组类型的索引子项。直接用foreach遍历整个数组时,循环会先拿到这些字符串值,而你试图用对象属性语法($a->title)访问字符串的属性,自然触发错误——字符串不是对象,没有可访问的属性。
假设你的数组结构类似这样:
$mixedArray = [ 'title' => '全局标题', 'des' => '全局描述', 0 => ['title' => '子项1标题', 'des' => '子项1描述'], 1 => ['title' => '子项2标题', 'des' => '子项2描述'], ];
正确遍历方法
方法1:遍历前过滤并判断类型
先单独处理顶层的关联字符串,再遍历子数组时判断类型,避免处理非数组项:
// 先处理顶层的关联内容 echo '全局标题:' . $mixedArray['title'] . PHP_EOL; echo '全局描述:' . $mixedArray['des'] . PHP_EOL; // 遍历整个数组,只处理子数组项 foreach ($mixedArray as $item) { if (is_array($item)) { // 数组方式访问(推荐,直接原生操作) echo '子项标题:' . $item['title'] . PHP_EOL; echo '子项描述:' . $item['des'] . PHP_EOL; // 如果一定要用对象属性访问,先转成对象 $objItem = (object)$item; echo '子项标题(对象方式):' . $objItem->title . PHP_EOL; echo '子项描述(对象方式):' . $objItem->des . PHP_EOL; } }
方法2:提前过滤出子数组并转对象
如果偏好全程用对象语法,可以先过滤出所有索引子数组,统一转成对象再遍历:
// 提取顶层关联值 $globalTitle = $mixedArray['title']; $globalDes = $mixedArray['des']; // 过滤出所有数组类型的子项,并转成对象 $subItems = array_map(function($item) { return is_array($item) ? (object)$item : null; }, $mixedArray); $subItems = array_filter($subItems); // 移除非数组项转成的null // 遍历对象数组 foreach ($subItems as $obj) { echo '子项标题:' . $obj->title . PHP_EOL; echo '子项描述:' . $obj->des . PHP_EOL; }
关键注意事项
- 不要直接遍历整个混合数组,必须区分字符串项和数组项
- 数组转对象的语法
(object)$array仅对数组有效,字符串无法转成带title属性的有效对象 - 优先使用数组键访问(
$item['title']),比转对象更高效且避免额外类型转换问题
内容的提问来源于stack exchange,提问作者Tpp
相关产品推荐
相关产品推荐

