2014-01-12 3 views
0

임의의 값을 사용하는 코드에 대해 작업하고 있는데, 몇 가지 검사가 올 바르며 올바른지 검사 한 다음 반환합니다. 그렇지 않은 경우, 기능이 발견 될 때까지 기능을 재실행해야합니다.거짓 인 경우 함수를 다시 실행하십시오.

임의의 값이 같은 일에 VAR를 설정합니다 올바른 경우 : 내가 원하는 무엇

public function generate_chair($id, $optredenID) 
{ 
    $model = new Model_Shop; 

    // Get all the chairs for the given room 
    $chairs = $model->check_chair($id); 

    // Get an array of reserved chairs for a given event 
    $reserved = $model->get_reserved($optredenID); 

    do { 
     // If chosen = 0, all chairs are available. 
     // If chosen = 1, one of the chairs is not available 
     $chosen = 0; 

     // Create a new empty array 
     $rand_chairs = array(); 

     // Pick a random chair 
     $chair = array_rand($chairs); 

     // Based off the amount chosen in the dorpdown, build array 
     switch($_POST['AantalPlaatsen']) { 
      case '1': 
       array_push($rand_chairs, $chair); 
      break; 

      case '2': 
       array_push($rand_chairs, $chair); 
       array_push($rand_chairs, $chair+1); 
       // Check if the chair chosen is the last chair in a row 
       // If it is, check for another chair 
       if($chair == 20 || $chair == 40 || $chair == 60 || $chair == 80 || $chair == 100 || $chair == 120 || $chair == 140 ||$chair == 160 || 
       $chair == 180 || $chair == 200) { 
        $chosen = 1; 
       } 
      break; 

      case '3': 
       array_push($rand_chairs, $chair); 
       array_push($rand_chairs, $chair+1); 
       array_push($rand_chairs, $chair+2); 
      break; 

      case '4': 
       array_push($rand_chairs, $chair); 
       array_push($rand_chairs, $chair+1); 
       array_push($rand_chairs, $chair+2); 
       array_push($rand_chairs, $chair+3); 
      break; 
     } 

     // Check if one of the random generated chairs is in the reserved array 
     // If so, the chair is unavailable and new random must be generated 
     if(count(array_intersect($rand_chairs, $reserved)) != 0) { 
      $chosen = 1; 
     } 

    } while ($chosen == 1); 

    return $rand_chairs; 

: 그것은 0의 전까지 현재 함수를 실행하겠습니다 while 루프를 사용하여 다음 $chosen = 1;을하고 지금은 작동하지만 누군가 다른 아이디어에 대한 아이디어가 있는지 궁금합니다. 스위치 케이스에 표시된 것처럼 고객이 2 개의 의자를 선택하고 첫 번째 의자가 행의 끝에있을 때 여러 개의 의자에 여러 개의 의자를 펼칠 수 없으므로 새 의자를 확인해야합니다.

내가하는 방법은 많은 (너무 많은) if 문을 사용하는 것입니다. 누구든지 더 나은 해결책을 알고 있습니까?

+0

0이 될 때까지 루프를 사용하십시오. –

+0

더 많은 블록을 포함하면 도움이 될 것입니다. 암호. 그것이 지금 서서, 질문은 나에게 너무 모호하게 보인다. 당신은 12 가지의 다른 방법으로 대답 할 수 있습니다. –

+0

@kuroineko 전체 기능을 포함하도록 게시물을 업데이트했습니다. – user1433479

답변

0

왜 여기에 재귀를 사용하고 있습니까? 재실행해야하는 기능의 일부만 반복하면 안됩니까?

do { 
    $chosen = 0; 

    // create a new empty array 
    $rand_chairs = array(); 

    // Pick a random chair 
    $chair = array_rand($chairs); 

    ... 

    foreach($rand_chairs as $key) { 
     if(in_array($key, $reserved)) { 
      $chosen = 1; 
      break; // oops, we need to rerun 
     } 
    } 
} while($chosen == 1) 

이 적어도 한번 본체 통해 실행 do-while 제어 구조를 사용한다. break 문은 키가 발견되었으므로 while 루프에서 빠져 나옵니다.

if(count(array_intersect($rand_chairs, $reserved)) != 0) { 
    $chosen = 1; 
} 
+0

이것은 작동하는 것처럼 보입니다. 그러나 배열 대신에 몇 번 후에 그냥 잠시로드 한 다음 빈 화면을 반환합니다. 이것은 $ chosen == 1 일 때만 발생하는 것으로 보입니다. – user1433479

+0

더 많은 코드를 포함하도록 내 게시물을 업데이트했습니다. 내 생각에 실제 문제는 $ array 변수를 설정하는 것일 수도 있습니다. 왜냐하면 배열 또는로드를 오랫동안 보여주기 때문입니다. – user1433479

+0

변경 사항을 기반으로 내 게시물을 편집했습니다. 나는 전에 더 많은 정보를 요구 했어야했다. 나는 네가 여기서 재귀를 잘못하고 있다고 생각해. – Lokno

0

빠른 알고리즘은 다음과 같이 뭔가를 갈 것 :

또한 대신 foreach 문의, 당신은 array_intersect()를 사용할 수 있습니다 당신은 양단에 앉아 "때문에 한 번에 좌석의 한 행을 실행하는 것입니다 인접한 행의 "는 실제로"함께 앉아 있지 않습니다 "...

Boolean seatsTaken() 
int startsAt(), runLength() 
For each row in seatsTaken 
    adjacent = 0 
    seat = 0 
    while not row(seat): 
    ++adjacent 
    if adjacent > 0: 
    startsAt.push(seat-adjacent) 
    runLength.push(adjacent) 

이렇게하면 모든 블록의 배열을 갖게됩니다. 충분히 큰 블록 만 선택하고 (runLength()> = needed)

+0

나는 이것을 너무 초기에 원했지만 코드는 "행"이 무엇인지를 알 길이 없었다. 컨테이너가 너비 (행당 20 석)를 제한하기 때문에 현재 행은 CSS를 통해 차단됩니다. – user1433479

관련 문제