PHP排列组合函数

2021-05-05 建站知识 浏览 手机预览
文章来源:http://www.imtr.cn/html/n261.html

举例:有数字1、2、3、4共4位数字,按两两一组进行无重复组合 / 可重复组合 / 全排列组合,直接保存为PHP文件运行

第一种:无重复排列组合

<?php
//无重复排列组合
function getCombinationToString($arr, $m, $push=null) {
    $rst = array();
    for($i = 0; $i < pow(2, count($arr)); $i++) {
        $a = 0;
        $b = array();
        for($j = 0; $j < count($arr); $j++) {
            if($i >> $j & 1) {
                $a++;
                array_push($b, $arr[$j]);
            }
        }
        if($a == $m) {
            if(!is_null($push)){
                if(is_string($push)){
                    $b = array_unshift($b, $push);
                }else{
                    $b = array_merge($push, $b);
                }
            }
            $rst[] = $b;
        }
    }
    return $rst;
}
$a = [1,2,3,4];
$b = getCombinationToString($a,2,[]);
echo '<pre>';
print_r($b);
?>

打印结果:

Array
(
   [0] => Array
       (
           [0] => 1
           [1] => 2
       )
   [1] => Array
       (
           [0] => 1
           [1] => 3
       )
   [2] => Array
       (
           [0] => 2
           [1] => 3
       )
   [3] => Array
       (
           [0] => 1
           [1] => 4
       )
   [4] => Array
       (
           [0] => 2
           [1] => 4
       )
   [5] => Array
       (
           [0] => 3
           [1] => 4
       )
)


第二种:无重复排列组合

<?php
//无重复排列组合
function getCombinationToString2($arr, $m)
{
    $result = array();
    if ($m ==1)
    {
        return $arr;
    }
    if ($m == count($arr))
    {
        $result[] = implode(',' , $arr);
        return $result;
    }
    $temp_firstelement = $arr[0];
    unset($arr[0]);
    $arr = array_values($arr);
    $temp_list1 = getCombinationToString2($arr, ($m-1));
    foreach ($temp_list1 as $s)
    {
        $s = $temp_firstelement.','.$s;
        $result[] = $s;
    }
    unset($temp_list1);
    $temp_list2 = getCombinationToString2($arr, $m);
    foreach ($temp_list2 as $s)
    {
        $result[] = $s;
    }
    unset($temp_list2);
    return $result;
}

$a = [1,2,3,4];
$b = getCombinationToString2($a,2);
echo '<pre>';
print_r($b);
?>

打印结果:

Array
(
   [0] => 1,2
   [1] => 1,3
   [2] => 1,4
   [3] => 2,3
   [4] => 2,4
   [5] => 3,4
)


第三种:无重复排列组合

<?php
//可重复排列组合(全组合)
function getCombinationToString3($arr, $m) {
    if ($m ==1) {
        return $arr;
    }
    $result = array();

    $tmpArr = $arr;
    unset($tmpArr[0]);
    for($i=0;$i<count($arr);$i++) {
        $s = $arr[$i];
        $ret = getCombinationToString3(array_values($tmpArr), ($m-1), $result);

        foreach($ret as $row) {
            $result[] = $s . $row;
        }
    }

    return $result;
}
$arr = array(1,2,3,4);
$r = getCombinationToString3($arr, 2);
echo '<pre>';
print_r($r);
?>

打印结果:

Array
(
   [0] => 12
   [1] => 13
   [2] => 14
   [3] => 22
   [4] => 23
   [5] => 24
   [6] => 32
   [7] => 33
   [8] => 34
   [9] => 42
   [10] => 43
   [11] => 44
)

原文地址:http://www.imtr.cn/html/n261.html
  • 如果你的问题还没有解决,可以点击页面右侧的“ ”,站长收到问题后会尽快回复解决方案到你的邮箱。
  • 创造始于问题,有了问题才会思考,有了思考,才有解决问题的方法,才有找到独立思路的可能。 —— 陶行知