You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何改写PHP代码中的each()函数以适配PHP 8.2版本?

适配PHP 8.2的代码修改方案

问题根源

each()函数在PHP 7.2已被标记为废弃,PHP 8.0及以上版本直接移除了该函数,原代码的while循环依赖此函数,必须替换为PHP 8.x支持的遍历方式。你之前的改写错误地颠倒了遍历对象,导致逻辑失效。

修正后的完整代码

protected function callActivities() {
    do_action( 'vc_mapper_call_activities_before' );
    // 替换each()循环为foreach,遍历原$activity数组
    foreach ($activity as $key => $value) {
        // 保留$this->init_activity的赋值,模拟each()返回的结构(如果后续逻辑依赖此变量)
        $this->init_activity = [$key, $value];
        // 从当前遍历的value中解构变量,替代原错误的$activity[1]
        list( $object, $method, $params ) = $value; 
        
        if ( 'mapper' === $object ) {
            switch ( $method ) {
                case 'map':
                    WPBMap::map( $params['tag'], $params['attributes'] );
                    break;
                case 'drop_param':
                    WPBMap::dropParam( $params['name'], $params['attribute_name'] );
                    break;
                case 'add_param':
                    WPBMap::addParam( $params['name'], $params['attribute'] );
                    break;
                case 'mutate_param':
                    WPBMap::mutateParam( $params['name'], $params['attribute'] );
                    break;
                case 'drop_all_shortcodes':
                    WPBMap::dropAllShortcodes();
                    break;
                case 'drop_shortcode':
                    WPBMap::dropShortcode( $params['name'] );
                    break;
                case 'modify':
                    WPBMap::modify( $params['name'], $params['setting_name'], $params['value'] );
                    break;
            }
        }
    }
}

关键改动说明

  • 替换遍历逻辑:用foreach ($activity as $key => $value)替代while + each(),这是PHP 8.x推荐的数组遍历方式,同时完整保留原遍历的键值对信息。
  • 修正变量解构:原代码中list(...) = $activity[1]是错误的($activity是整个数组,$activity[1]仅取固定索引元素),改为从当前遍历的$value中解构,对应原each($activity)返回的[1]位置的value值。
  • 保留状态变量:如果后续代码依赖$this->init_activity存储当前遍历的键值对,我们通过$this->init_activity = [$key, $value]模拟each()返回的数组结构,确保逻辑兼容。

内容的提问来源于stack exchange,提问作者Ilya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:54:56