php跳转到循环内的前一个语句

So basically i'm trying to create a complex timetable and i have these two methods that each perform a different check function for me:

  1. Checks if i have a unique array

      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. checks that each subject does not appear more than twice in a day

    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;
    
    }
    

I'm calling the functions from a loop and populating timetable array only if all conditions area satisfied:

    $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;
        }

My requirements

If the checkDayLimit returns false , i want to go back and call tutorAllot function again to pick a new value. I need to do this without breaking the loop.

I was thinking maybe i could use goto statement but only when am out of options.

Is there a way i can achieve this without using goto statement. PHP v5.5.3 Ubuntu

Your architecture seems overly complex. Instead of

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

Why not incorporate both checks into a single function? It would

  1. Filter out data that is not eligible to be picked, and return an array of legitimate choices
  2. Pick at random from the safe choices and return the pick

addendum 1

I don't think there is any need for recursion. I would use array_filter to pass the data through a function that returns true for eligible members and false for the rest. I would then take the result of array_map and make a random selection from it