PHP each()函数废弃报错替换为foreach后异常,求正确修复方案
PHP
each() 函数弃用报错修复方案 报错原因
PHP 7.2及以上版本已经正式弃用each()函数,所以会抛出对应的Deprecated警告,属于PHP版本升级后的常见兼容性问题。
直接替换foreach失效的原因
each()函数返回的是当前数组指针位置对应的包含键、值双元素的数组,结构为[0 => 键名, 1 => 键值, 'key' => 键名, 'value' => 键值],赋值给$activity后,后续代码大概率同时用到了键、值两个维度的内容。
你直接用foreach($array as $activity)替换后,$activity仅能拿到原数组的键值,丢失了键名维度的信息,原有逻辑被破坏所以问题更严重。
正确修复方法
方案1:兼容原有逻辑的foreach改写(推荐)
不需要修改循环内的原有代码,只要调整循环头并补充一行结构兼容代码即可:
foreach($this->element_activities[ $tag ] as $key => $value) { // 构造和each()返回结构完全一致的$activity变量 $activity = [0 => $key, 1 => $value, 'key' => $key, 'value' => $value]; // 此处保留你原来while循环内的所有代码无需改动 }
方案2:指针遍历改写
如果原有逻辑依赖数组指针的移动特性,可以用官方推荐的指针函数组合替代:
// 先重置数组指针保证遍历从头部开始 reset($this->element_activities[ $tag ]); while ( $value = current($this->element_activities[ $tag ]) ) { $key = key($this->element_activities[ $tag ]); $activity = [0 => $key, 1 => $value, 'key' => $key, 'value' => $value]; // 移动指针到下一位,对应each()的指针移动逻辑 next($this->element_activities[ $tag ]); // 此处保留你原来while循环内的所有代码无需改动 }
额外说明
如果确认原有循环内只用到了$activity['value']或者$activity[1]的内容,也可以直接简化为foreach($this->element_activities[ $tag ] as $activity),同时把循环内所有$activity['value']/$activity[1]的引用直接改成$activity即可。
内容的提问来源于stack exchange,提问作者Mayte Alava
相关产品推荐
相关产品推荐

