2016-07-16 93 views
0

所以基本上我想創建一個複雜的時間表內,我有兩種方法,每個都爲我執行不同的校驗功能:PHP跳到前面的語句循環

  1. 檢查,如果我有一個獨特陣列

    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']); 
    } 
    
  2. 檢查每個對象沒有出現兩次以上在一天

    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

您的架構看起來過於複雜。而不是

pick at random >> check limit >> if at limit, go to re-pick... 

爲什麼不把兩個檢查合併到一個函數中?這將

是沒有資格
  1. 篩選出的數據被拾起,並隨機從安全的選擇返回家園的合法選擇的數組
  2. 挑選並返回挑

增編1

我不認爲有任何遞歸的需要。我將使用array_filter通過一個函數傳遞數據,該函數返回true,其餘爲合格成員,false。然後,我將採取array_map的結果,並從中隨機選擇

+0

因爲我需要單獨的支票,但您的建議我可以從tutorAllot()中調用checkDayLimit(),並立即返回安全選擇或單獨函數根據兩個函數的返回值遞歸調用它自己? – GOA

+0

我已經添加了一段 – BeetleJuice

+0

讓我試試看,因爲coz遞歸實際上已經引發了內存限制錯誤 – GOA