我正在开发一个PHP脚本,我有两个ID数组。我需要生成可以通过配对两个数组中的ID来创建的每个可能的集合。每个集合都需要包含每个ID的配对。
我目前正在使用三个嵌套的for
循环,只要每个数组中只有三个项目,这似乎会产生所需的结果:
Array
(
[0] => Array
(
[1] => A
[2] => C
[3] => B
)
[1] => Array
(
[1] => A
[2] => B
[3] => C
)
[2] => Array
(
[1] => B
[2] => A
[3] => C
)
[3] => Array
(
[1] => B
[2] => C
[3] => A
)
[4] => Array
(
[1] => C
[2] => B
[3] => A
)
[5] => Array
(
[1] => C
[2] => A
[3] => B
)
)
但是,如果我在每个数组中最多4个项目,我可以告诉一些组合缺失。我也得到了一些重复集,在这种情况下我可以忍受,但仍然不理想。我怀疑这与我的for
循环有关,只有3深,而且我实际上应该在这里使用递归,但是递归很少出现在我做的工作类型中,我无法确定如何有效地实施它以返回这种特殊情况所需的结果。
这是我目前的代码:
$first = array(1, 2, 3, 4,);
$second = array('A', 'B', 'C', 'D',);
$len = count($second);
for ($i = 0; $i < $len; ++$i) {
// Loop through positions
for ($pos = 1; $pos < ($len - 1); ++$pos) {
// Rotate loop
$second_fixed = array_slice($second, 0, $pos);
$second_rotate = array_slice($second, $pos);
$second_rotate_len = count($second_rotate);
for ($k = 0; $k < $second_rotate_len; ++$k) {
$second_rotate[] = array_shift($second_rotate);
$second = array_merge($second_fixed, $second_rotate);
$set = array_combine($first, $second);
$alternates[] = $set;
}
}
$second[] = array_shift($second);
}
print_r($alternates);
答案 0 :(得分:0)
我现在能做的最好。如果数组的长度不同,则需要调整。
$first = array(1, 2, 3, 4,);
$second = array('A', 'B', 'C', 'D',);
foreach($first as $f) {
$result[] = array_combine($first, $second);
$s = array_shift($second);
$second[] = $s;
}
print_r($result);
答案 1 :(得分:0)
查找生成列表的所有排列的算法(或伪代码),然后对其进行调整。这基本上就是你在这里所做的。