用两个foreach循环重构方法


refactor method with two foreach loops

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

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个不同的地方有这些前臂环。如果我extact foreach循环并返回数组,我仍然需要在方法中创建一个foreach循环,以填充本例中的$langRules。也许有简单的方法可以做到,但我看不到…

这不仅仅是将代码的"任务"部分分解为回调的问题吗?

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()函数保持原样,现在只处理循环,每次需要处理这些循环中的某些内容时,只需将回调主体的不同实现传递给它。

根据你的例子,似乎是在满足你的需求。如果没有,请澄清,我可能会增加这一点,以满足您的需求。