Это интересный вопрос, потому что это распространенная схема, и на нее особенно важно обращать внимание при рефакторинге.
В чисто функциональном смысле вы можете использовать такой код:
function rand_or_min( $value, $key, $country ) {
$rand = mt_rand(0,100);
if ($rand < $value ) { $rand = $value; }
// do something
call_user_func( array( $country, 'set_' . $value ), array( $rand ) );
}
$arr = array('infrastructure' => 5,'education' => 3,'healthcare' => 80);
array_walk( $arr, 'rand_or_min', $country );
Хотя вышесказанное работает хорошо, я настоятельно рекомендую вам использовать более объектно-ориентированный путь. Всякий раз, когда вы видите шаблон, подобный приведенному выше, вы должны думать о классах и подклассах. Зачем? Потому что есть дублированное поведение и подобное состояние (переменные).
В более широком смысле это может быть реализовано так:
class SomeBasicBehavior {
function __construct( $min = 0 ) {
$rand = mt_rand(0,100);
if( $rand < $min ) { $rand = $min };
return $rand;
}
}
class Infrastructure extends SomeBasicBehavior {
}
class Education extends SomeBasicBehavior {
}
class Healthcare extends SomeBasicBehavior {
}
$country->set_infrastructure( new Infrastructure() );
$country->set_education( new Education() };
$country->set_healthcare( new Healthcare() };
Мало того, что он гораздо более читабелен, но также гораздо более расширяем и тестируем. Ваше «сделать что-то» может быть легко реализовано как функции-члены в каждом классе, и их поведение может быть настолько общим, насколько это необходимо (с использованием класса SomeBasicBehavior), или таким инкапсулированным, как вам требуется.