2009-05-03 71 views
0

我想要做的是以下幾點:我有一個值的數組,這些值將最終被用來生成一個隨機的唯一字符串,但稍後。首先我想遍歷數組中的所有值(foreach循環),然後我想限制這個(while循環)這是做這個的正確方法嗎?可能在循環中使用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) 
      { 

      } 
    } 

?> 
+0

使用我發佈的代碼,我生成了一個沒有問題的一百萬個字符的密鑰。 – Sam152 2009-05-03 00:55:01

回答

11

你不是應該遞增while循環內的計數器,所以它可以退出?

+0

謝謝扎克,+1 – 2009-05-03 00:56:37

+0

順便說一句,對不起,如果這碰到光顧。 (顯然有人認爲是這樣;它被壓低了)。那不是意圖。 – bsneeze 2009-05-03 01:05:11

+0

嘿,不用麻煩大家,我只是在這裏學習,歡呼。 – 2009-05-03 01:13:48

0

爲什麼不做類似下面的代碼,它會生成一個循環的密鑰。地獄,爲什麼不做一個生成密鑰的函數?

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); 
0

所有你發佈的代碼是合法的,但顯然你已經離開了一樣東西,那是,那將有助於回答這一部分...否則,你的$計數器while循環,它在保持不變將永遠不會退出

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. $array被分配的一維陣列:
    array(0 => '1', 1 => '2', 2 => '3', ...)
  2. $length設置爲。
  3. $counter要設置。
  4. 開始for loop; $values = $array[0] = '1'
  5. $counter遞增。 $counter = 。
  6. 開始while loop;檢查$counter()< = $length()。
  7. 什麼都不做。
  8. 回線6
  9. 第6行:如果$counter()< $length =(),繼續循環。
  10. 第7行:什麼也不做。
  11. 第8行:返回第6行。
  12. 第6行:$counter()仍然< $length =(),進入循環一次。
  13. 第7行:什麼也不做。 8
  14. 行:回到6行

正如你所看到的,你是停留在一個無限循環,因爲無論$counter也不$length變化值。因此,第6行中的while條件始終計算爲true(1 < = 15)。