2011-04-14 146 views
0

我不知道如何解決這個問題。Php動態嵌套循環幫助

我的代碼比下面的時間,但這個關於總結起來:

$array = array(array('A','a'),array('B','b'),array('C','c'),array('D','d')); 
$array2 = array(); 
$i = 0; 
while ($i < 2) { 
    $j = 0; 
    while ($j < 2) { 
     $k = 0; 
     while ($k < 2) { 
      $l = 0; 
      while ($l < 2) { 
       $array2[] = $array[0][$i] . $array[1][$j] . $array[2][$k] . $array[3][$l]; 
       $l++; 
      } 
      $k++; 
     } 
     $j++; 
    } 
    $i++; 
} 

好了,所以什麼結果$數組2看起來就像是:

array ( 
    0 => 'ABCD', 
    1 => 'ABCd', 
    2 => 'ABcD', 
    3 => 'ABcd', 
    4 => 'AbCD', 
    ........ // i have omitted several almost identical lines 
    14 => 'abcD', 
    15 => 'abcd', 
) 

現在的問題是如下。

我將如何動態創建一個嵌套到其他人的while循環,基於$ array中有多少元素?

現在你可以看到有4個元素(4個子數組),因此有4個while循環。

請注意,隨意更改變量名稱。

感謝堆,如果你可以幫助,即使你只是給一個鏈接,但一個完整的答案是首選。

+0

while循環,如果週期數是已知切勿使用。用於循環。或者,如果循環的次數是由陣列數隱式知道的話。 – markus 2011-04-14 10:02:13

+0

我知道,這是一箇舊的腳本,我還沒有到處去改變它,如果我要重寫它,它是多餘的。 – FraserK 2011-04-14 10:13:19

+0

你只是想計算一個*的排列或所有字符abcd的所有可能的組合? – 2011-04-14 10:20:33

回答

1

awnser是遞歸。

創建一個函數來置換數組,並在該函數中調用與沒有第一個元素的數組相同的函數。之後,您排列第一個元素並將其添加到前一個函數調用的結果中。

一定要有一個良好的停止條件(如果它被一個空數組調用,只返回一個空數組),否則你將得到一個stackoverflow或一個索引超出界限的錯誤。


我的PHP是一個有點生疏,我不知道這是否編譯,但它應該是這樣的很多:

function permutate($array) { 
    if (empty($array)) { 
    //Stop condition. 
    return $array; 
    } 
    //recursion 
    $permtail = permutate(array_slice($array,1)); 
    //permtail now contains the permutated result of the array without 
    //the first element 

    $result = array(); 
    //permutate the first element 
    foreach($array[0] as $value) { 
    //prepend it to all permutations 
    foreach($permtail as $tail) { 
     $result[] = array_merge((array)$value, $tail); 
    } 
    } 
    return $result; 
} 
+0

您可以給我一個例子嗎? – FraserK 2011-04-14 09:58:36

+0

這個函數的作用除了我不認爲'$ permtail'實際上正在設置的事實。好吧 – FraserK 2011-04-27 22:08:34