PHP-生成数组中项目的所有组合

时间:2019-10-03 11:45:26

标签: php combinations

我有一个像这样的PHP数组...

$myarray = array(
'red', 'yellow', 'green, 'blue'
);

顺序对我来说并不重要,所以我认为我正在尝试计算combinations而不是permutations。我想把这个找回来...

$finalarray = array(
    'Red', 'Green',
    'Red', 'Yellow',
    'Red', 'Blue',
    'Green', 'Yellow',
    'Green', 'Blue',
    'Yellow', 'Blue'
);

是否有内置的PHP功能来实现这一目标,或者有一种方法可以通过循环来实现?

2 个答案:

答案 0 :(得分:1)

下面的示例

 $myarray = array( 'red', 'yellow', 'green', 'blue' );
 $finalarray = [];
 for ($i = 0; $i < count($myarray); $i++) {
     for ($j = $i + 1; $j < count($myarray); $j++) {
         $finalarray[] = $myarray[$i];
         $finalarray[] = $myarray[$j];
     }
 }
 print_r($finalarray);

将打印此

 Array ( [0] => red [1] => yellow [2] => red [3] => green [4] => red [5] => blue [6] => yellow [7] => green [8] => yellow [9] => blue [10] => green [11] => blue )

答案 1 :(得分:1)

您当然可以使用置换库,但是您必须按字母顺序sort每个单个数组,并使用array_unique()删除重复项。

或者您可以尝试提高成本效益:

$myarray = array(
'red', 'yellow', 'green', 'blue'
);

$result = [];

while ($item = array_pop($myarray)) {
    foreach($myarray as $couple) {
        $result[] = [$item, $couple];
    }
}

print_r($result);

第一件事是您要在每个步骤中简化源数组,并且每个上下文都应具有其数组副本。这意味着,如果您愿意将机制封装在递归函数中以生成两个以上的成员数组,则需要防止其内部副本被其自身上下文的array_pop以外的其他内容更改。

对于上面的代码解释,我从源数组的顶部弹出一个元素,然后遍历幸存的元素以耦合一对。这样,我就不会将“红色”与“红色”配对,并且不会产生无序的重复项。