2016-07-16 92 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