所以基本上我正在尝试创建一个复杂的时间表,我有这两种方法,每种方法都为我执行不同的检查功能:
-
检查我是否有唯一的数组
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
您的体系结构似乎过于复杂。而不是
pick at random >> check limit >> if at limit, go to re-pick...
为什么不将两个检查合并到一个函数中?它会
- 筛选出不符合选择条件的数据,并返回一系列合法选择
- 从安全选项中随机选择并返回选择
增编1
我认为没有必要递归。我会使用 array_filter
通过一个函数传递数据,该函数为符合条件的成员返回true
,为其余成员返回false
。然后我会取array_map
的结果并从中随机选择。