метод рефакторинга с двумя циклами foreach

Я столкнулся с проблемой рефакторинга. У меня есть много похожих методов, но я не могу найти способ извлечь одну строку из них и создать другой закрытый метод.

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;
}

У меня есть эти петли foreach в 4 разных местах. Если я извлекаю циклы foreach и возвращаю массив, мне все равно нужно сделать один цикл foreach в методе, чтобы заполнить $ langRules в этом примере. Может быть, есть простой способ сделать это, но я не могу это увидеть …

0

Решение

Разве это не просто вопрос выделения части задачи из этого кода в обратный вызов?

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() Функция as должна просто обрабатывать цикл сейчас и просто передавать ему другую реализацию тела обратного вызова каждый раз, когда вам нужно что-то обработать в этих циклах.

Тот кажется выполнить то, что вам нужно, на основе вашего примера. Если нет, просьба уточнить, и я мог бы дополнить это, чтобы покрыть ваши потребности.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]