如何将两个遍历相同数据的foreach循环合并为支持多返回值的单个函数
需求可行性结论
该需求完全可以实现。两个原函数遍历的是完全相同的数据源$p,仅循环内执行的逻辑不同,合并后仅需一次遍历即可同时完成两类计算,相比分开调用两个函数还能减少一次数组遍历的开销,性能更优。
具体实现方案
注意原func1匹配到符合条件的项后会终止循环,但func2需要遍历完所有$p元素才能生成完整的$d数组,因此匹配到条件后仅做标记、不终止循环,合并后的代码如下:
public function mergedFunc($p, $c) { // 初始化返回结果 $result = [ 'is' => false, // 对应原func1返回值,直接用布尔类型比0/1更符合开发规范 'd' => [] // 对应原func2返回的数组 ]; if (empty($p)) { return $result; } // 一次遍历同时完成两类逻辑 foreach ($p as $v) { // 原func2的逻辑:组装prod数组加入结果集d $result['d'][] = [ 'name' => $v['name'], 'price' => $v['price'], 'reference' => $v['ref'] ]; // 原func1的逻辑:判断是否匹配条件,已匹配过则跳过重复判断 if (!$result['is'] && !empty($c['prod']) && $c['prod'] == $v['ref'] && !empty($c['status'])) { $result['is'] = true; // 此处不能加break,否则后续的prod项无法加入d数组 } } return $result; }
调用方式示例
// 调用合并后的函数 $res = $yourObject->mergedFunc($p, $c); // 单独获取布尔结果 $is = $res['is']; // 单独获取数组结果 $d = $res['d'];
可选优化点
- 如果你的PHP版本 >= 7.1,可以使用数组解构语法直接赋值两个变量,写法更简洁:
['is' => $is, 'd' => $d] = $yourObject->mergedFunc($p, $c); - 如果业务场景不需要完整的
$d数组,仅需要匹配项之前的部分数据,可以保留原func1的break逻辑,根据自身业务需求调整即可。 - 如果需要兼容原
func1返回0/1整型的格式,仅需把$result['is']的初始值改为0,匹配时赋值为1即可。
内容的提问来源于stack exchange,提问作者XTRUST.ORG
相关产品推荐
相关产品推荐

