2016-06-28 8 views
0

私は関数を実行していますが、その一部は乱数を選択する必要がありますが、既に選択されている数値の配列に入れることはできません。したがって、選択した乱数が配列内にある場合は、新しい番号を選択する必要があります。私は本当にここだから、現在のロジックphp再帰関数が正しく機能しない

function choice() { 
global $countries; 
global $count; 
global $answers; 
global $choice; 
$i = rand(0,$count-1); 
if(in_array($i,$answers)) choice(); 
else { 
    $answers[] = $i; 
    $choice = $countries[$i]['capital_city']; 
    return $choice; 
} 

そう簡単に思える何かに苦しんでいるように見える、それはその後、イマイチ場合はその配列に、それは変数を設定し、それを返した場合、それは乱数、チェックを選択しています、そうであれば、関数を再起動して新しい番号を生成します。何が起こるかは、関数内で見つかると、関数を介して返されるのではなく、空の結果を返します。私はどうしたら間違っているのですか?

+0

これには構文エラーがあります。 –

+2

正確なエラーと場所が何であるかを教えてくれないと、まず助けにならない人はいません – Li357

+1

あなたは再帰呼び出しを返しません。 – Rizier123

答えて

1

再帰呼び出しの前returnのステートメントを追加します。

function choice() { 
    global $countries; 
    global $count; 
    global $answers; 
    global $choice; 

    $i = rand(0,$count-1); 

    if(in_array($i,$answers)) return choice(); 
    else { 
     $answers[] = $i; 
     $choice = $countries[$i]['capital_city']; 
     return $choice; 
    } 
+0

それはうまくいくようだが、私はそれのような単純なものが欠けていることを知っていた。 – Source

+0

しかし、何が良い、この方法、またはwhileループを使用してですか? – Source

+0

whileループはオーバーヘッドが少なくなると思います。また、グローバルの代わりに参照を使用する – atoms

2

再送を使用する必要がない場合は、whileループを使用するだけではありませんか?

function choice() { 
    global $countries; 
    global $count; 
    global $answers; 
    global $choice; 

    $i = rand(0,$count-1); 

    while (in_array($i,$answers)){  
     $i = rand(0,$count-1); 
    } 

    $answers[] = $i; 
    $choice = $countries[$i]['capital_city']; 
    return $choice; 
} 

それともwhileのこのdo whileインプレースを使用します。

do { 
    $i = rand(0,$count-1); 
} while (in_array($i,$answers)); 
+1

カウント値を変更する必要はありませんでした。 – Source

+1

do whileループはおそらくここで少し良く見えるだろうと思う:) – Rizier123

+0

は同意して答えを更新した – atoms

関連する問題