我有一个二维数组。假设每个职位我都有一个候选人来填补它。
例如:
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-4-4
3-3-4
候选人不能比以前“小”。
这不可能发生:
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个限制。
任何帮助?
韩国社交协会!
答案 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);
?>