具有两个foreach循环的重构方法

时间:2014-09-22 12:08:53

标签: php arrays foreach refactoring

我遇到了重构问题。我有许多类似的方法,但我找不到从它们中提取一行的方法,并制作另一种私有方法。

private function constructRules($rules, \Languages $langs) {
    foreach ($rules as $fieldType => $rule) {
        foreach ($langs->all() as $lang) {
           //line below changes
            $langRules[$fieldType . '[' . $lang->lang . ']'] = $rule; 
        }       
    }

    return $langRules;
}

我在4个不同的地方有这些foreach循环。如果我接触foreach循环并返回数组,我仍然需要在方法中创建一个foreach循环,以填充此示例中的$ langRules。也许有简单的方法可以做到,但我无法看到它......

1 个答案:

答案 0 :(得分:2)

这不仅仅是要解决"任务问题。部分代码进入回调?

private function constructRulesUsingCallBack($rules, \Languages $langs, $task) {
    $langRules = [];
    foreach ($rules as $fieldType => $rule) {
        foreach ($langs->all() as $lang) {
           $task($langRules, $fieldType, $lang, $rule);
        }       
    }

    return $langRules;
}

$langRules = constructRulesUsingCallBack($rules, $langs, function (&$langRules, $fieldType, $lang, $rule) {
    $langRules[$fieldType . '[' . $lang->lang . ']'] = $rule; 
});

我对PHP不太满意,我对内联函数表达式中需要的样板数量不满意,但是PHP似乎并没有很好地实现闭包(无论如何,我可以锻炼身体。

但是你可以按原样保留constructRulesUsingCallBack()函数来处理循环,每次需要处理这些循环中的内容时,只需将回调体的不同实现传递给它。

根据您的示例,似乎可以满足您的需求。如果没有,请澄清,我可以增加它以满足您的需求。