所以基本上我正在尝试创建一个复杂的时间表,我有两个方法,每个方法都为我执行不同的检查功能:
检查我是否有一个唯一的数组
function tutorAllot($array,$check,$period){
//check for clashes and return non colliding allotment
shuffle($array);
$rKey = array_rand($array);
if(array_key_exists($array[$rKey]['teacher_id'], $check[$period])) {
return $this->tutorAllot($array,$check,$period);
}
return $tutor = array($array[$rKey]['teacher_id'] => $array[$rKey]['subject_code']);
}
检查每个主题每天的出现次数是否超过两次
function checkDayLimit($data,$check){
//check double day limit
$max = 2;
$value = array_values($check);
$tempCount = array_count_values($data);
return (array_key_exists($value[0], $tempCount) && $tempCount[$value[0]] <= $max) ? true : false;
}
只有满足所有条件区域时,我才会从循环调用函数并填充时间表数组:
$outerClass = array();
foreach ($value as $ky => $val) {
$innerClass = array(); $dayCount = array();
foreach ($periods[0] as $period => $periodData) {
$innerClass[$period] = array();
if(!($periodData == 'break')){
$return = $this->Schedule->tutorAllot($val,$clashCheck,$period);
if($return){
//check that the returned allocation hasnt reached day limit
if($this->Schedule->checkDayLimit($dayCount,$return)){
$innerClass[$period] += $return;
$clashCheck[$period] += $return;
}else{
}
}
}else{
$innerClass[$period] = '';
}
}
//debug($innerClass);
$outerClass[$ky] = $innerClass;
}
我的要求
如果checkDayLimit返回false,我想返回并再次调用tutorAllot函数来选择一个新值。 我需要在不破坏循环的情况下这样做。
我在想也许我可以使用goto语句,但只有在没有选项时才会使用。
有没有办法可以在不使用goto语句的情况下实现这一点。 PHP v5.5.3 Ubuntu
答案 0 :(得分:0)
您的架构似乎过于复杂。而不是
pick at random >> check limit >> if at limit, go to re-pick...
为什么不将两个检查合并到一个函数中?它会
附录1
我认为不需要递归。我会使用array_filter
通过一个函数传递数据,该函数为符合条件的成员返回true
,为其余成员返回false
。然后我会取array_map
的结果并从中随机选择