Drupal模块嵌套foreach循环报错:如何正确获取数组sid值
解决Drupal模块中foreach循环的「Invalid argument supplied for foreach()」警告
嘿,这个警告我之前在Drupal开发里也碰到过,问题根源在于你没必要用嵌套foreach遍历整个数组,而且第二层循环处理的对象并不全是可遍历的类型!
问题分析
从你给出的$submission数组结构来看,包含sid的对象明确在$submission['build_info']['args'][1]这个位置,但你当前的嵌套foreach会遍历$submission下的所有元素(比如build_info),再遍历build_info下的所有元素——如果某个元素不是数组或可遍历对象,就会触发这个警告,而且这种遍历完全是冗余的。
最优解决方案:直接定位目标元素
既然已经知道sid的精确位置,直接访问是最高效且不会报错的方式:
// 先做存在性和类型校验,避免Undefined index或调用非对象属性的错误 if (isset($submission['build_info']['args'][1]) && is_object($submission['build_info']['args'][1])) { $sid = $submission['build_info']['args'][1]->sid; }
兼容动态结构的方案(如果数组结构不固定)
如果你的业务场景中$submission的结构可能变化,必须用遍历的方式,那一定要在foreach前添加类型校验,确保当前变量是可遍历的:
foreach($submission as $sub) { // 检查$sub是否是数组或实现了Traversable接口的可遍历对象 if (is_array($sub) || $sub instanceof Traversable) { foreach($sub as $a) { // 同样校验$a是数组,且存在索引1的对象 if (is_array($a) && isset($a[1]) && is_object($a[1])) { $sid = $a[1]->sid; // 找到目标后直接跳出两层循环,提升效率 break 2; } } } }
这样既解决了警告问题,又能准确获取到sid值。
内容的提问来源于stack exchange,提问作者user3386779
相关产品推荐
相关产品推荐

