PHP置换多个相同的元素

时间:2012-11-06 12:16:58

标签: php permutation

我需要一个能够返回所有可能组合的函数,

e.g。

chars = range('a','c');

  1. = a a a
  2. = a a b
  3. = a b a
  4. = a b b
  5. = a b c
  6. = a c b ... ñ。 = c c c
  7. (顺序无所谓)

    等等

    我得到了这个

    function pc_permute($items, $perms = array( )) {
        if (empty($items)) {
            $return = array($perms);
        }  else {
            $return = array();
            for ($i = count($items) - 1; $i >= 0; --$i) {
                 $newitems = $items;
                 $newperms = $perms;
             list($foo) = array_splice($newitems, $i, 1);
                 array_unshift($newperms, $foo);
                 $return = array_merge($return, pc_permute($newitems, $newperms));
             }
        }
        return $return;
    }
    
    $p = pc_permute(array(0, 1, 2, 3));
    var_dump($p);
    

    来自Here

    但是我无法弄清楚如何机会/重写它以获得与多个相同元素的所有可能组合。

    谢谢,穆罕默德

1 个答案:

答案 0 :(得分:1)

请使用此功能:

<?php 
$characters = range('a','c');


function get_permutations(array $arr = array()){
    if(count($arr) == 1){
        return array_values($arr);
    }

    $return_array = array();

    foreach($arr as $key => $val){
        $temp_arr = $arr;
        unset($temp_arr[$key]);
        $temp = call_user_func(__FUNCTION__, $temp_arr);
        for($x = 0; $x < count($temp); $x++){
            $temp[$x] = $val.$temp[$x];
        }
        $return_array = array_merge($return_array, $temp);
    }
    return $return_array;
}

var_dump(get_permutations($characters));

输出:

array(6) {
  [0]=>
  string(3) "abc"
  [1]=>
  string(3) "acb"
  [2]=>
  string(3) "bac"
  [3]=>
  string(3) "bca"
  [4]=>
  string(3) "cab"
  [5]=>
  string(3) "cba"
}

修改

<?php 
$characters = range('a','h');


function get_permutations(array $arr = array(), $max_length = NULL){
    if(count($arr) == 1 || ($max_length !== NULL && $max_length <= 1)){
        return array_values($arr);
    }

    $return_array = array();

    foreach($arr as $key => $val){
        $temp_arr = $arr;
        unset($temp_arr[$key]);
        $temp = call_user_func(__FUNCTION__, $temp_arr, $max_length !== NULL ? $max_length - 1 : NULL);
        for($x = 0; $x < count($temp); $x++){
            $temp[$x] = $val.$temp[$x];
        }
        $return_array = array_merge($return_array, $temp);
    }
    return $return_array;
}

var_dump(get_permutations($characters, 4));

注意:注意使用a-z范围会导致更长的运行时间甚至导致内存不足错误,所以我测试了它的小范围:)