2017-09-28 3 views
1

ここに私のコードです。なぜ私は無限ループにいるのか分かりません。 配列に対して一意のランダムな値を作るときに$ checkがループを止めなければならないと思います。PHPエンドレスループ、なぜですか?

<?php 

     $foo["blue"] = 0; 
     $foo["black"] = 0; 
     $foo["red"] = 0; 
     $foo["white"] = 0; 

     $check; 
     do 
     { 
      foreach($foo as &$val) 
      { 
       $val = rand(1,6); 
      } 

      $foo = array_unique($foo); 
      $check = count($foo); 

     } 
     while($check != 4); 

     echo '............................ <br>'; 
     foreach($foo as $key=>$value) 
     { 
      echo $key . ' ' . $value . '<br>'; 
     } 

    ?> 
+0

'ますprint_r($ fooという)を入れてみてください;' '行う-while'をループ内の値であるかを確認します。 – Barmar

+0

@isheggそれは大丈夫です、それはあなたが 'foreach'ループで現在の配列要素を更新する方法です。 – Barmar

+0

'$ foo = array_unique($ foo)'です。最初の繰り返しの後に配列に重複した値があると、その行は '$ foo'を3つ以下の要素の配列にします。したがって、' $ check'は常に4と異なります。したがって、ループは無限になります。 ループが停止する唯一の方法は、最初の反復後に4つの異なるランダム値が得られる場合です。 –

答えて

0

個人的には、ランダムなセットに最終的にマッチするために一日中かかるような低エントロピーのループでは個人的にはしません。

より良い方法は、範囲を生成してランダム化し、配列をループして値を設定することです。

<?php 
$rand = range(1, 6); 
shuffle($rand); 

$foo["blue"] = 0; 
$foo["black"] = 0; 
$foo["red"] = 0; 
$foo["white"] = 0; 

$i=0; 
foreach ($foo as $key => $value) { 
    $foo[$key] = $rand[$i]; 
    $i++; 
} 

print_r($foo); 
/*Array 
(
    [blue] => 1 
    [black] => 3 
    [red] => 2 
    [white] => 5 
) 
*/ 

https://3v4l.org/4hPku

+0

ありがとうございます。今、私は分かる。 – Svetlozar

1

問題は、いくつかの重複があるループを介して初めて、そうarray_unique()foreachループを作ることはできません1〜4つの要素からアレイ、2、または3が低減することですそれは現在配列に存在する要素をループしているだけなので、もう一度大きくしてください。だから、配列が縮小すると、4つの要素には戻らず、$check != 4は常にtrueになります。

アレイの元のキーを取得して使用する必要があります。

<?php 

    $foo["blue"] = 0; 
    $foo["black"] = 0; 
    $foo["red"] = 0; 
    $foo["white"] = 0; 
    $keys = array_keys($foo); 

    $check; 
    do 
    { 
     foreach($keys as $i) 
     { 
      $foo[$i] = rand(1,6); 
     } 

     $foo = array_unique($foo); 
     $check = count($foo); 

    } 
    while($check != 4); 

    echo '............................ <br>'; 
    foreach($foo as $key=>$value) 
    { 
     echo $key . ' ' . $value . '<br>'; 
    } 

?> 

DEMO

関連する問題