2012-02-10 88 views
1

我有一個數組,像這樣:PHP遞歸增量

Array ([0] => 0 [1] => 0 [2] => 0); 

有3個元素(3個整數),我希望他們的值從0到36;

據我所知,最好的方法是遞歸,因爲每個元素都必須檢查它是否在最大值(36),如果是,它將最後一個元素設置爲0並遞增前一個元素。

所以我基本上陣願意去這樣的:

Array ([0] => 0 [1] => 0 [2] => 0); 
Array ([0] => 0 [1] => 0 [2] => 1); 
Array ([0] => 0 [1] => 0 [2] => 2); 
... 
Array ([0] => 0 [1] => 0 [2] => 36); 
Array ([0] => 0 [1] => 1 [2] => 0); 
Array ([0] => 0 [1] => 1 [2] => 1); 
.... 
Array ([0] => 0 [1] => 1 [2] => 36); 
Array ([0] => 0 [1] => 2 [2] => 0); 

ETC ETC ETC 

但我還是不知道如何遞歸做到這一點!

然而,解決方案還需要爲4個元素和5個元素和6等等工作!

有人可以給我一些方向嗎?

+2

這應該代表一個基數爲37的數字嗎? – 2012-02-10 12:53:20

回答

2

與Timurs的答案類似,但稍微更高效,並採用可變基。

$array = array(0, 0, 0); 

function bloop(&$array, $amount, $base = 37) 
{ 
    $i = count($array) - 1; 
    while ($i >= 0) { 
     $array[$i] = $amount % $base; 
     $amount = ($amount - $array[$i--])/$base; 
    } 
} 

bloop($array, (37 * 37 * 2) + (37 * 5) + 8); // 2, 5, 8 

var_dump($array); 
2

如果您只想要基數爲37的數字,請考慮使用base_convert來代替。

+2

基地轉換的最大值是36? – 2012-02-10 12:59:10

+1

好點。這似乎是一個很大的巧合......這是作業嗎? – 2012-02-10 13:08:26

1
function fill($limit){ 
    $ret = array(); 
    while($i<=$limit){ 
     while($j<=$limit){ 
     while($k<=$limit){ 
      $ret[] = array($i,$j,$k); 
      print_r($a); 
      $k++; 
     } 
     $j++; 
     } 
     $i++; 
    } 
    return $ret; 
} 

fill(36); 
+0

這將無法正常工作,因爲它必須能夠變大。 – 2012-02-10 13:09:10

+0

增加了一些代碼來返回實際的數組 – 2012-02-10 13:18:05

1
function increment(&$array,$num){ 
    $plus = $num; 
    for($i=count($array)-1;$i>=0;$i--){ 
     $array[$i] += $plus; 
     if($array[$i]>36){ 
      $tmp = $array[$i]%37; 
      $plus = ($array[$i]-$tmp)/37; 
      $array[$i] = $tmp; 
     }else{ 
      break; 
     } 
    } 
} 

// init array 
$array = array(0,0,0); 
// increment 100 times 
increment($array,100); 

var_dump($array); 
+0

這是完美的!然而它正確地從(0,0,0) - (0,0,36),但在0,0,36之後它變爲0,1,1 RATHER THAN 0,1,0 ...我怎麼修改這個? – 2012-02-10 13:25:52

+0

噢...錯誤的'%'基礎......編輯我的帖子 – Timur 2012-02-10 13:30:07

2
$limit = 36; 
$step = 1; 
$array = array (0 , 0 , 0); 


function increment(array $array , $limit , $step) { 
    $result = $array = array_values($array); 
    while(count(array_keys($result , $limit)) != count($array)) { 
     for($i = 1 ; $i <= count($result) ; $i++) { 
      while($result[ count($result)-$i ] < $limit) { 
       $result[ count($result)-$i ] += $step; 
      } 
     } 
    } 
    return $result; 
} 

var_dump(increment($array , $limit , $step)); 
1

你看這個?

<?php 
$arr = array(0=>0,2=>0); 
foreach (range(0,36) as $f) 
{ 
    echo "<pre>";print_r(array_pad(array($f),3,0)); 
    echo "<pre>";print_r(array_pad(array($f),-3,0)); 
    $arr_n = $arr+array(1=>$f); 
    ksort($arr_n); 
    echo "<pre>"; print_r($arr_n); 
} 

?>