在php中需要一组排列数字列表

时间:2014-01-09 17:45:09

标签: php arrays permutation

这里我需要一个由排列生成的所有数字的数组,并且在这里我从html表单中给出n和k。

function combination_number($k,$n){

    $n = intval($n);
    $k = intval($k);
    if ($k > $n){
        return 0;
    } elseif ($n == $k) {
        return 1;
    } else {
        if ($k >= $n - $k){
            $l = $k+1;
            for ($i = $l+1 ; $i <= $n ; $i++)
                $l *= $i;
            $m = 1;
            for ($i = 2 ; $i <= $n-$k ; $i++)
                $m *= $i;
        } else {
            $l = ($n-$k) + 1;
            for ($i = $l+1 ; $i <= $n ; $i++)
                $l *= $i;
            $m = 1;
            for ($i = 2 ; $i <= $k ; $i++)
                $m *= $i;            
        }
    }
    return $l/$m;
}

function array_combination($le, $set){

    $lk = combination_number($le, count($set));
    $ret = array_fill(0, $lk, array_fill(0, $le, '') );

    $temp = array();
    for ($i = 0 ; $i < $le ; $i++)
        $temp[$i] = $i;

    $ret[0] = $temp;

    for ($i = 1 ; $i < $lk ; $i++){
        if ($temp[$le-1] != count($set)-1){
            $temp[$le-1]++;
        } else {
            $od = -1;
            for ($j = $le-2 ; $j >= 0 ; $j--)
                if ($temp[$j]+1 != $temp[$j+1]){
                    $od = $j;
                    break;
                }
            if ($od == -1)
                break;
            $temp[$od]++;
            for ($j = $od+1 ; $j < $le ; $j++)    
                $temp[$j] = $temp[$od]+$j-$od;
        }
        $ret[$i] = $temp;
    }
    for ($i = 0 ; $i < $lk ; $i++)
        for ($j = 0 ; $j < $le ; $j++)
            $ret[$i][$j] = $set[$ret[$i][$j]];   

    return $ret;
}
$number = $_REQUEST['number'];

for($i=0;$i<$number;$i++)
{
   $arr[$i]=$i+1;
}
$k = $_REQUEST['select'];
$permutations = array_combination($k, $arr);


echo "<pre>";
print_r($permutations);

此代码正在运行,但它没有给出Permutation生成的所有数字。我也需要这些数字。请告诉我怎样才能得到那些?请帮忙。

1 个答案:

答案 0 :(得分:0)

我不确定它是否是最佳解决方案,但这似乎可以做你想要的

function array_combination($le, $set){
    // Your existing code
    // …

    for ($i = 0 ; $i < $lk ; $i++)
        for ($j = 0 ; $j < $le ; $j++)
            $ret[$i][$j] = $set[$ret[$i][$j]];

    // Changes start here
    $desiredArray = $ret;

    foreach($ret as $innerArray)
    {
        $desiredArray[] = array_reverse($innerArray);
    }

    return $desiredArray;
}