Как получить всю перестановку из массива в php?

у меня есть массив

$a = array(1,2,3,4,5);

я хочу получить все комбинации $n элементы в массиве

$n = 3

выход

1 2 3
1 3 4
1 4 5
2 3 5
2 4 5
.
.
.
5 1 2

-1

Решение

По сути, вы должны перейти от начала к концу массива, поместив текущее число в начало, а затем добавить все перестановки массива без номера в начале массива. Если вы используете рекурсию, это довольно просто.
Пример:

input: [1] [2] [3]

step 1: [1] [unknown] [unknown]

Теперь вызовите функцию для генерации всех перестановок (эта функция) и добавьте к ней все массивы, которые вы получите.

Количество итераций, необходимое для каждого вызова функции: n! (n)*(n-1)*(n-2) ... ,

0

Другие решения

Некоторое время назад у меня был похожий вопрос о том, что я делал для своей повседневной работы (которая не является программистом). Я нашел версию JavaScript для следующего кода. Надеюсь, я достаточно хорошо это перекодировал. Комментарии от меня. Если вы можете подождать какое-то время (скоро ухожу в отпуск), тогда я могу решить, как ограничить рекурсивные вызовы, чтобы сделать его менее ресурсоемким.

<?php

function combinations($arr){
$result = array();
//the result array, returned by this outer function.
function fn($active, $rest, &$a){
if(!$active && !$rest)
return;//If we have empty arrays, stoppit
if(!$rest){
//Are we out of remaining options? Yep, add the active array.
$a[] = $active;
}else{
/*
we are currently splitting the work between the two options. First is that we compute the
combinations of the currently $active and the $rest array offset by 1.
*/
fn($active, array_slice($rest,1), $a);
$active[] = $rest[0];
//Next we add in the first element of the rest array to the active array, and slice off that new element to avoid duplicates.
fn($active, array_slice($rest,1), $a);

}
} //Function that actually does the work;
fn([],$arr,$result);
return $result;
}

$combos = combinations([1,2,3,4,5]);
$combos = array_filter($combos,function($item){
return count($item) == 2;
});

print_r($combos);

?>
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector