2013-05-17 1 views
0

Я PHP noob, который работает довольно долго с наименьшими задачами. Im пытается создать цикл while, который жив, пока не найдет совпадение, строки, которые должны совпадать, представляют собой две случайные строки из двух массивов. Но моя проблема в том, что цикл while застревает, когда они не соответствуют смыслу, случайные значения не изменяются после извлечения. Я просто не могу обойти его, может кто-то, пожалуйста, помогите мне. Это плохой код, который у меня есть.Сравнение, извлечение и удаление из массива строк PHP

$seed1 = array("kim","Jake","Mac","Pi"); 
$seed2 = array("Vi","Nik","Nis","Fid"); 

$teamTemp1 = $seed1[array_rand($seed1)]; 
$teamTemp2 = $seed2[array_rand($seed2)]; 

while(true){ 
    if($teamTemp1 == "Kim" && $teamTemp2 != "Nis"){ 
     echo $teamTemp1 ." + ".$teamTemp2; 
     return false; 
    } 
    if($teamTemp1 == "Jake" && $teamTemp2 != "Fid"){ 
     echo $teamTemp1 ." + ".$teamTemp2; 
     return false; 
    } 
    if($teamTemp1 == "Mac" && $teamTemp2 != "Vi"){ 
     echo $teamTemp1 ." + ".$teamTemp2; 
     return false; 
    } 
    if($teamTemp1 == "Pi" && $teamTemp2 != "Fid"){ 
     echo $teamTemp1 ." + ".$teamTemp2; 
     return false; 
    } 
} 
+3

Вы никогда не изменяя значения '$ teamTemp1' и' $ teamTemp2', поэтому цикл никогда не закончится. Вам нужно выполнить эти назначения внутри цикла. – andrewsi

ответ

1

Я думаю, что вы работаете, чтобы сделать это рандомизации матч-между одним из членов каждой команды ... но предотвращение конкретных совпадения, которые вы не хотите делать?

Во всяком случае: базовая концепция цикла while состоит в том, чтобы наблюдать изменение базового значения до тех пор, пока оно не достигнет допустимого состояния.

Задача 1: Ваши базовые значения не меняются. $teamTemp1 и $teamTemp2 никогда не меняются внутри цикла while. Поэтому они повторяют одни и те же значения снова и снова.

Решение 1. Переместите рандомизаторы внутри цикла while, так что каждая итерация приведет к новому случайному совпадению.

Задача 2: Система может быть очень легко застряла, если вы не будете осторожны в отношении входов и запрещенных совпадений.

Решение 2: Я бы рекомендовал добавить выпуск аварийного выхода, если после стольких попыток вы не найдете допустимого совпадения. Это не нашло бы для вас действительной цели, но это по крайней мере не позволит вам блокироваться.

Как так:

$seed1 = array("kim","Jake","Mac","Pi"); 
$seed2 = array("Vi","Nik","Nis","Fid"); 

$tries = 0; 
while(true){ 
    $teamTemp1 = $seed1[array_rand($seed1)]; // I change every time the loop repeats! 
    $teamTemp2 = $seed2[array_rand($seed2)]; // I change every time the loop repeats! 

    if($teamTemp1 == "Kim" && $teamTemp2 != "Nis"){ 
     echo $teamTemp1 ." + ".$teamTemp2; 
     return false; 
    } 
    if($teamTemp1 == "Jake" && $teamTemp2 != "Fid"){ 
     echo $teamTemp1 ." + ".$teamTemp2; 
     return false; 
    } 
    if($teamTemp1 == "Mac" && $teamTemp2 != "Vi"){ 
     echo $teamTemp1 ." + ".$teamTemp2; 
     return false; 
    } 
    if($teamTemp1 == "Pi" && $teamTemp2 != "Fid"){ 
     echo $teamTemp1 ." + ".$teamTemp2; 
     return false; 
    } 

    if($tries > 1000){ 
     return false; // Emergency Escape! 
    } 
    $tries++; 
} 
+0

Спасибо, что вы меня :) это то, что я делаю для – Rocksteady

+0

Что мне нужно сделать, чтобы удалить имя из teamTemp1 после успешного совпадения @ Вольфманье? – Rocksteady

+0

То есть, из $ seed1? Ну, это зависит от того, пытаетесь ли вы сделать команды меньше или пытаетесь увеличить количество недопустимых совпадений? Вы пытаетесь убедиться, что все в команде 1 сопоставлены с случайным человеком из команды 2? –

0

На деле, вы должны сделать так:

do { 
    $teamTemp1 = $seed1[array_rand($seed1)]; 
    $teamTemp2 = $seed2[array_rand($seed2)]; 

    if($teamTemp1 == "Kim" && $teamTemp2 != "Nis"){ 
     echo $teamTemp1 ." + ".$teamTemp2; 
     return false; 
    } 
    if($teamTemp1 == "Jake" && $teamTemp2 != "Fid"){ 
     echo $teamTemp1 ." + ".$teamTemp2; 
     return false; 
    } 
    if($teamTemp1 == "Mac" && $teamTemp2 != "Vi"){ 
     echo $teamTemp1 ." + ".$teamTemp2; 
     return false; 
    } 
    if($teamTemp1 == "Pi" && $teamTemp2 != "Fid"){ 
     echo $teamTemp1 ." + ".$teamTemp2; 
     return false; 
    } 
} while(1); 
+1

[array_rand()] (http://php.net/manual/en/function.array-rand.php) - array_rand вытаскивает ключ, а не значение. –

+0

Несомненно ... Я исправлю это ... Спасибо ... –

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