PHP 在循环中跳转到上一条语句


php jumping to previous statement inside a loop

所以基本上我正在尝试创建一个复杂的时间表,我有这两种方法,每种方法都为我执行不同的检查功能:

  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

您的体系结构似乎过于复杂。而不是

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

为什么不将两个检查合并到一个函数中?它会

  1. 筛选出不符合选择条件的数据,并返回一系列合法选择
  2. 从安全选项中随机选择并返回选择

增编1

我认为没有必要递

归。我会使用 array_filter 通过一个函数传递数据,该函数为符合条件的成员返回true,为其余成员返回false。然后我会取array_map的结果并从中随机选择。