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