我试着写一个程序,打印数组元素的每一个可能的排列。
示例:listPermutations($array)
,其中$array = array(0,1,2)
应该返回0,1,2
0,2,1
1,0,2
, 1,2,0
, 2,0,1
, 2,1,0
的六种排列。
<?php
$myNumber = 3;
function createArray($objCount){
for($i = 0; $i < $objCount; $i++){
$array[$i] = $i;
}
return $array;
}
function printPermutations($array, $firstObj){
//echo var_dump($array)."<br>";
echo count($array)."<br>";
if(count($array) == 2){
echo $firstObj.$array[0].$array[1];
echo $firstObj.$array[1].$array[0];
}
else{
for($i = 0; $i < count($array); $i++){
$arrayWithoutI = array_splice($array, $i, 1);
echo var_dump($array)."<br>";
echo printPermutations($arrayWithoutI, $i).' ';
}
}
}
function listPermutations($objCount){
$array = createArray($objCount);
//echo print_r($array)."<br>";
printPermutations($array, 0);
}
echo listPermutations($myNumber);
?>
代码应该递归地工作如下:
如果$array
的数组长度不等于2,则对数组中的每个元素$i
调用printPermutaions
,去掉$i
,将$i
作为排列的第一个元素
但是程序的输出如下:
3
array(2) { [0]=> int(1) [1]=> int(2) }
1
array(0) { }
1
array(0) { }
1
array(0) { }
1
array(0) { }
1 ...
...
为什么删除一个元素后输出是1而不是2?
array splice通过引用获取数组
array array_splice( array &$input , int $offset [, int $length [, mixed $replacement = array() ]] )
表示它正在改变给定的数组。
当你从0迭代到count($array)
时,它会计算每次循环运行的数组长度。
$array = [1,2,3,4,5];
count($array); //5
array_splice($array,2);
count($array); //2
array_splice改变数组长度。