首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP - 2D数组中的所有排列-唯一和有序的值

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

Stack Overflow用户
提问于 2015-04-15 16:07:10
回答 1查看 350关注 0票数 0

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

例如:

代码语言:javascript
复制
Position 0 -> Candidates: 1,2,3
Position 1 -> Candidates: 3,4,5
Position 2 -> Candidates: 4,5

翻译:

代码语言:javascript
复制
Array_Position(
  array('1', '2', '3'),
  array('3', '4','5'),
  array('4', '5')   
);

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

  1. 没有重复(如果一个候选人已经在一个位置,它不能再次出现在另一个位置)。 这是不可能的: 1-4-43-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

我看到了这样的答案:

代码语言:javascript
复制
<?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);

?>

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

有什么帮助吗?

Tks!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-15 17:56:52

因为任何候选人都不能比以前的候选人小,所以任何职位都不能在链中重复。下面的代码完成了这个任务,请检查它是否适合您。

代码语言:javascript
复制
<?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);

?>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29655322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档