2014-01-12 2 views
0

Я работаю над кодом, который принимает случайное значение, проверяет, правильно ли это с несколькими проверками, и если да, то он вернет его. Если это не так, предполагается перезапустить функцию до тех пор, пока она не будет найдена.Функция повторного запуска, если false

Если случайное значение правильно он будет установлен вар 1, как это: $chosen = 1;, а затем с помощью цикла, пока она будет продолжать работать текущую функцию до тех пор пока это 0:

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; 

То, что я хотел работает сейчас, но мне интересно, есть ли у кого-то идея для другой проблемы. Как показано в шкафу-переключателе, когда клиент выбирает 2 стула, а первый - в конце строки, он должен проверить новый стул, потому что вы не можете раскладывать несколько стульев на несколько рядов.

То, как я это делаю, - это много (слишком много), если утверждения. Кто-нибудь знает лучшее решение?

+0

использовать пока цикл до тех пор, пока не будет выбран 0. –

+0

Было бы проще помочь вам, если бы вы включили немного больше своих код. Как сейчас, этот вопрос кажется мне слишком расплывчатым. Вы можете ответить на него по-разному. –

+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, так как ключ найден.

Кроме того, вместо foreach заявления, вы можете использовать array_intersect():

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

Кажется, что это работает, но через несколько раз вместо массива он просто загружается некоторое время, а затем возвращает пустой экран. Это происходит, только когда $ selected == 1. – user1433479

+0

Я обновил сообщение, чтобы добавить больше кода. Я думаю, что фактическая проблема может заключаться в установке $ selected var, поскольку он либо показывает массив, либо нагрузку в течение длительного времени. – user1433479

+0

Я отредактировал сообщение, основанное на ваших изменениях. Я должен был попросить больше информации раньше. Я думаю, вы неправильно используете рекурсию. – Lokno

0

Faster алгоритм будет идти-то вроде этого: вы бы запустить один ряд сидений в то время, так как «сидя на противоположных концах смежных рядов "на самом деле не« сидит вместе »...

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()> = required) и произвольно выберите один из них.

+0

Я тоже хотел этого, но мой код не знает, что такое «строка». Прямо сейчас строка просто обрезается через CSS, потому что контейнер ограничивает ширину (20 мест в строке). – user1433479

Смежные вопросы