从两个数组中获取每对可能的对

时间:2014-03-04 21:58:07

标签: php arrays

我正在开发一个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);

2 个答案:

答案 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)

查找生成列表的所有排列的算法(或伪代码),然后对其进行调整。这基本上就是你在这里所做的。