致命错误:Cannot use string offset as an array——数组值对比的正确方式
数组遍历与属性对比的语法问题排查
直接说问题根源:你的代码触发致命错误,核心原因是遍历到了非数组类型的元素,却强行用数组的方式访问它的属性。
先看你写的遍历代码:
foreach ($xml_record_ray['inf']['rec'] as $key_item => $item) { $field = "100"; if ($item["@attributes"]["tag"] == $field) { } }
对照你提供的数组结构,$xml_record_ray['inf']['rec']下包含三个元素:
lead:字符串类型(值为"500")field:数组类型dfield:数组类型
当循环走到lead这个元素时,$item是字符串"500",你却试图访问$item["@attributes"]——字符串不能通过数组键名的方式取值,这直接触发了致命错误。
另外,你要找的tag="100"的元素,其实在dfield数组的子元素里,并不是rec的直接子元素,所以你的遍历范围也不对。
修正方案
根据你的需求,给你两种可行的写法:
方案1:直接遍历目标层级(推荐,更高效)
如果你明确要找的是dfield里的元素,直接定位遍历这个数组,同时加上键存在的判断避免额外错误:
$field = "100"; // 直接定位到dfield数组进行遍历 foreach ($xml_record_ray['inf']['rec']['dfield'] as $key => $item) { // 先检查@attributes和tag是否存在,再做对比 if (isset($item["@attributes"]["tag"]) && $item["@attributes"]["tag"] === $field) { // 这里写你匹配成功后要执行的逻辑 var_dump($item); // 示例:输出匹配到的元素 } }
方案2:全范围遍历(如果需要检查rec下所有可能的子元素)
如果你不确定目标元素的位置,需要遍历rec下所有可能的数组元素,可以先判断类型再处理:
$field = "100"; foreach ($xml_record_ray['inf']['rec'] as $key => $item) { // 先判断当前元素是否是数组,并且包含@attributes和tag if (is_array($item) && isset($item["@attributes"]["tag"])) { if ($item["@attributes"]["tag"] === $field) { // 处理匹配到的元素 } } // 如果当前元素是包含子数组的容器(比如field、dfield),遍历子元素 elseif (is_array($item)) { foreach ($item as $sub_item) { if (isset($sub_item["@attributes"]["tag"]) && $sub_item["@attributes"]["tag"] === $field) { // 处理子元素里的匹配项 var_dump($sub_item); } } } }
额外提示
- 永远记得用
isset()检查数组键是否存在,这能帮你避免大部分"未定义索引"的错误。 - 尽量精准定位遍历范围,不要遍历无关元素,既能减少错误概率,也能提升代码运行效率。
内容的提问来源于stack exchange,提问作者newert
相关产品推荐
相关产品推荐

