0
所以基本上我想创建一个复杂的时间表内,我有两种方法,每个都为我执行不同的校验功能:PHP跳到前面的语句循环
检查,如果我有一个独特阵列
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
因为我需要单独的支票,但您的建议我可以从tutorAllot()中调用checkDayLimit(),并立即返回安全选择或单独函数根据两个函数的返回值递归调用它自己? – GOA
我已经添加了一段 – BeetleJuice
让我试试看,因为coz递归实际上已经引发了内存限制错误 – GOA