为何我的foreach循环仅执行一次就停止?
搞定你的循环终止问题!
我一眼就看到了两个导致循环只跑一次的问题,咱们一个个说:
1. 提前返回打断了循环
你把return $pieces;写在if (!in_array($field, $skip))的代码块里了!这意味着第一次找到不需要跳过的字段时,函数直接就返回结果了,后面的循环迭代根本没机会执行。这就像你刚打扫完第一个房间就交差下班,剩下的房间完全没碰。
2. in_array用错了参数
在检查字段是否在fields_active里的时候,你只传了数组$pieces['fields_active'],但in_array需要两个参数:要查找的值和目标数组。你漏掉了要检查的$field,导致这个判断逻辑完全失效。
修正后的代码
function bg_calculation_save ( $pieces ) { $skip = array('company_name', 'logo', 'screenshot', 'highlight_1', 'highlight_2', 'highlight_3', 'awards'); foreach ($pieces[ 'fields' ] as $field => $value) { if (!in_array($field, $skip)) { // 计算分数 $points = bg_calculate_points($field) * bg_score_weights($field); // 设置对应_points字段的值 $pieces[ 'fields' ][ $field . '_points' ][ 'value' ] = $points; // 如果当前字段不在待保存列表里,就加进去 if (!in_array($field, $pieces[ 'fields_active' ])) { $pieces[ 'fields_active' ][] = $field; } } } // 所有字段处理完再返回结果 return $pieces; } add_filter( 'pods_api_pre_save_pod_item_vpn', 'bg_calculation_save' );
关键修改点
- 把
return $pieces;移到了foreach循环外面,确保所有符合条件的字段都能被处理一遍。 - 修复了
in_array的参数,补上了第一个参数$field,让判断逻辑正常工作。
这样修改后,你的循环就能完整遍历所有需要处理的字段啦!
内容的提问来源于stack exchange,提问作者TinyTiger
相关产品推荐
相关产品推荐

