我想要一个多维数组,其中每个元素都是一个X元素数组 - 比方说3。
我基本上想在第3个元素中从0到y(比方说12)计数,然后在0,0,12之后我希望数组中的下一个元素是数组0,1,0 - 以12结束,12,12。
我在基数计算... 12,在完成时滴答到数组中的下一个元素。
e.g。
0,0,0
0,0,1
...
0,0,12
0,1,0
0,1,1
0,1,2
...
0,1,12
0,2,0
...
12,12,12
好的,好的 - 我可以这样做
$maxCountNumber= 12;
$i=1;
for ($j=0; $j < $maxCountNumber+1; $j++) {
for ($k=0; $k < $maxCountNumber+1; $k++) {
for ($l=0; $l < $maxCountNumber+1; $l++) {
print "<br/>$i: $j, $k, $l";
$results[$i] = array($j, $k, $l);
$i++;
}
}
}
但是,如果我不想每次只有3个元素 - 有时我会想要4 - 而不是数百,数十和单位我想要数千,数百,数十和单位......或者7个元素怎么样?
我确信递归是答案,但我似乎无法绕过这个特殊问题。
除非在12秒而不是10秒内有些东西可以计算在我身上?
感谢您的所有建议。
答案 0 :(得分:2)
现在好了,让我们看看......
$numberOfDimensions = 3;
$base = 13;
$YourArray = array(); //This array will hold the complete data.
$LastArray = array();
for($o = 0; $o < $numberOfDimensions; ++$o) //Gives us something to start with.
$LastArray[$o] = 0;
while($LastArray[0] < $base) { //Makes sure, we're not going out of bounds
$index = $numberOfDimensions - 1;
$YourArray[] = $LastArray; //Adds the array you filled last to the result array.
while($index >= 0) { //This is where things start to get interesting.
if(++$LastArray[$index] < $base) break; //Still in bounds, continue.
else {
if($index) //Overflow for all but the first element..
$LastArray[$index] = 0;
--$index; //Moving on to the previous digit.
}
}
}
echo "<pre>";
echo print_r($YourArray);
echo "</pre>";
Phew ......当我读到这个问题时,我疲惫的大脑比我想象的要困难得多。这应该有效......如果您对代码有疑问,请随时提出。
我现在已经测试了它,它可以实现预期目标。在我的测试中,我遇到了一个愚蠢的错误,特此修复。抱歉延误。
答案 1 :(得分:2)
此算法预先计算总共需要的循环次数,然后使用$ i计算每个数组位置的值。
$max= 13;
$elements = 4;
$loops = pow($max, $elements);
$main_array = array();
for($i = 0; $i < $loops; $i++){
for($j = 0; $j < $elements; $j++){
$main_array[$i][$j] = floor($i/pow($max,$elements-1-$j))%$max;
}
}
这是我发现的最优雅的解决方案,只有2个嵌套循环,每次使用幂和模数进行1次算术运算,以获得所需的数组。
您只需调整元素和/或基数。
用0.014秒来计算3个位置的数组。
用0.25秒来计算4个位置的阵列。
需要4.08秒才能计算出5个位置的数组*
*对于我需要增加memory_limit的5个位置,我想因为数组太大了,如果你只输出数字而不是存储一个巨大的数组,这个脚本会轻得多。
答案 2 :(得分:0)
您的基本递归如下:
<?php
class StrangeBase {
private static function loopOnStrangeBase($place, $base, $printstr) {
if (($place < 0) || ($base < 0)){ return; }//edge case
for ($idx=0; $idx<$base; $idx++) {
if ($place == 0) {
echo "$printstr,$idx\n";
} else {
if($printStr !== ''){
StrangeBase::loopOnStrangeBase($place - 1, $base, $printstr.",$idx");
} else {
StrangeBase::loopOnStrangeBase($place - 1, $base, "$idx");
}
}
}
}
public static function printStrangeBase($places, $base) {
StrangeBase::loopOnStrangeBase($places, $base, "");
}
}
StrangeBase::printStrangeBase(3, 12);
现在,您可以将其修改为不是静态函数,而是还保存到数组。要做到这一点,你的阵列应该“向后”增长;这是数组中的第一个元素是数字中最低位的位置。然后,您可以进一步修改递归函数以获取函数指针并运行任意代码,而不是简单地打印出它的位置。