0

私がやろうとしているのは次のとおりです。値の配列があります。これらの値は、最終的にランダムな一意の文字列を生成するために使用されますが、それは少し後です。最初に、配列内のすべての値をループ処理 (foreach ループ) してから、これを制限したい (while ループ) これは正しい方法ですか?

以下のコードは機能しません。誰かが私が間違っていることを理解できますか?

<?php 

    $array = array(
          '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 
          'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 
          'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 
          'u', 'v', 'w', 'x', 'y', 'z', '!', '£', '$', '%',
          '^', '&', '*', '(', ')', '_', '+', '{', '}'
    );

    $length_of_unique_key = 15;
    $counter = 0;

    foreach($array as $values)
    {
          $counter++;

          while ($counter <= $length_of_unique_key)
          {

          }
    }

?>
4

4 に答える 4

11

while終了できるように、ループ内でカウンターをインクリメントするべきではありませんか?

于 2009-05-03T00:46:13.010 に答える
7

ループ (またはその他の制御構造) の何が問題なのかを確認する最善の方法は、ループを実行することです。頭の中でできることもあります。また、コードにトレース ポイントを挿入すると役立つ場合もあります。

この場合、頭の中でコードを実行するだけで、何が問題なのかを理解できると思います。しかし、教訓的な目的のために、ここでそれを実行します。まず、コードの各行に番号を付けましょう。

$array = array(...);               // line 1
$length = 15;                      // line 2
$counter = 0;                      // line 3
foreach($array as $values)         // line 4
{
      $counter++;                  // line 5
      while ($counter <= $length)  // line 6
      {
                                   // line 7
      }                            // line 8
                                   // line 9
}                                  // line 10

それでは、実行してみましょう。

  1. $array1 次元配列が割り当てられます。
    array(0 => '1', 1 => '2', 2 => '3', ...)
  2. $lengthは15に設定されています。
  3. $counter0を設定することです。
  4. 開始しfor loopます。$values= $array[0]= '1' .
  5. $counter増加します。$counter= 1 .
  6. 開始しwhile loopます。$counter( 1 ) <= $length( 15 )であることを確認してください。
  7. 何もしない。
  8. 6行目に戻ります。
  9. 行 6: $counter( 1 ) <= $length( 15 ) の場合、ループを続行します。
  10. 行 7: 何もしません。
  11. 8 行目: 6 行目に戻ります。
  12. 6 行目: $counter( 1 ) はまだ <= $length( 15 ) であり、再びループに入ります。
  13. 行 7: 何もしません。
  14. 8 行目: 6 行目に戻ります。

ご覧のとおり、値$counter$length変更されていないため、無限ループに陥っています。したがって、while6 行目の条件は常にtrue (1 <= 15) と評価されます。

于 2009-05-03T01:29:07.353 に答える
0

以下のコードのようなことをしてみませんか。1 つのループでキーを生成します。地獄、キーを生成するための関数を作成してみませんか?

function keyval($length)
{
    $length_of_unique_key = $length;
    $array = array(
          '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 
          'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 
          'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 
          'u', 'v', 'w', 'x', 'y', 'z', '!', '£', '$', '%',
          '^', '&', '*', '(', ')', '_', '+', '{', '}'
    );
    for($i=0;$i<$length_of_unique_key;$i++)
    {
        $key.=$array[rand(0,sizeof($array)-1)];
    }
    return $key;
}

echo keyval(15);
于 2009-05-03T00:46:36.333 に答える
0

あなたが投稿したすべてのコードは合法ですが、明らかに何かを省略しており、それがこれに答えるのに役立つ部分です...そうでなければ、 $counter は while ループ中に一定のままであり、決して終了しません

于 2009-05-03T00:46:49.437 に答える