如何从PHP中的数组获取所有permutaion?

时间:2017-02-19 19:00:05

标签: php arrays permutation

我有一个数组

$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

2 个答案:

答案 0 :(得分:0)

你基本上会在数组中从开始到结束,将当前数字放在开头,然后附加数组的所有排列,而不包括数组开头的数字。如果你使用递归,这很简单。 例如:

input: [1] [2] [3]

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

现在调用函数生成所有排列(此函数)并将所有数组追加到该函数中。

每次函数调用所需的迭代次数为n! (n)*(n-1)*(n-2) ...

答案 1 :(得分: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);

?>