2012-02-10 91 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); 
} 

?>