我有一个二维数组。假设每个职位我都有几个候选人来填补它。
例如:
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')
);我想要所有的组合,有两个限制:
在这种情况下,所有可能的组合是:
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);
?>但他们都没有解决这两个限制。
有什么帮助吗?
Tks!
发布于 2015-04-15 17:56:52
因为任何候选人都不能比以前的候选人小,所以任何职位都不能在链中重复。下面的代码完成了这个任务,请检查它是否适合您。
<?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);
?>https://stackoverflow.com/questions/29655322
复制相似问题