PHP - 2D数组中的所有排列 - 唯一且有序的值

时间:2015-04-15 16:07:11

标签: php arrays combinations permutation

我有一个二维数组。假设每个职位我都有一个候选人来填补它。

例如:

Position 0 -> Candidates: 1,2,3
Position 1 -> Candidates: 3,4,5
Position 2 -> Candidates: 4,5

翻译:

Array_Position(
  array('1', '2', '3'),
  array('3', '4','5'),
  array('4', '5')   
);

我想要所有组合,有2个限制:

  1. 不重复(如果候选人已在一个位置,则不能再次出现在另一个位置)。
    这不可能发生:
    1-4-4
    3-3-4

  2. 候选人不能比以前“小”。
    这不可能发生:
    1-5-4
    3-5-4

  3. 在这种特殊情况下,所有可能的组合将是:
    1-3-4
    1-3-5
    1-4-5
    2-3-4
    2-3-5
    2-4-5
    3-4-5

    我看到了这样的答案:

    <?php       
        function array_cartesian() {
            $_ = func_get_args();
            if(count($_) == 0)
                return array(array());
            $a = array_shift($_);
            $c = call_user_func_array(__FUNCTION__, $_);
            $r = array();
            foreach($a as $v)
                foreach($c as $p)
                    $r[] = array_merge(array($v), $p);
            return $r;
        }
    
        $cross = array_cartesian(
            array('1', '2', '3'),
            array('3', '4','5'),
            array('4', '5') 
        );
    
        print_r($cross);
    
    ?>
    

    但他们都没有解决2个限制。

    任何帮助?

    韩国社交协会!

1 个答案:

答案 0 :(得分:0)

由于任何候选人都不能比他之前的小,所以任何职位都不能在链中重复。以下代码可以解决问题,检查它是否适合您。

<?php

function permute()
{
    $result = array();

    if (func_num_args() == 0)
        return $result; // empty array

    foreach (func_get_arg(0) as $value)
        nextPermute($result, $value, $value, 1, func_get_args());

    return $result;
}

function nextPermute(&$result_array, $permute_value,
                    $last_value, $next_arg, $all_args)
{
    if ($next_arg < count($all_args))
    {
        foreach ($all_args[$next_arg] as $value)
            if ($value > $last_value)
                nextPermute($result_array, $permute_value . '-' . $value, $value, $next_arg + 1, $all_args);
    }
    else
        array_push($result_array, $permute_value);
}

$cross = permute(
    array('1', '2', '3'),
    array('3', '4', '5'),
    array('4', '5')
);

print_r($cross);

?>