【问题标题】:PHP - All permutations in a 2D array - Unique and ordered valuesPHP - 二维数组中的所有排列 - 唯一且有序的值
【发布时间】:2015-04-15 16:07:10
【问题描述】:

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

例如:

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

在这种特殊情况下,所有可能的组合将是:
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 个限制。

有什么帮助吗?

谢谢!

【问题讨论】:

    标签: php arrays combinations permutation


    【解决方案1】:

    由于任何候选人都不能小于他的前一个,因此任何位置都不能在链中重复。以下代码可以解决问题,请检查它是否适合您。

    <?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);
    
    ?>
    

    【讨论】:

    • 很高兴听到它有效@Erick,如果这是正确答案,请单击答案左侧的复选标记。 :)
    猜你喜欢
    • 1970-01-01
    • 2017-03-27
    • 2011-01-31
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    相关资源
    最近更新 更多