Я пытаюсь написать программу, которая печатает все возможные перестановки элементов массива.
Пример: 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
не равно двум, то для каждого элемента $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 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 изменяет длину массива. и считать ($ массив) изменений.
Других решений пока нет …