我有一个像这样的PHP数组...
$myarray = array(
'red', 'yellow', 'green, 'blue'
);
顺序对我来说并不重要,所以我认为我正在尝试计算combinations
而不是permutations
。我想把这个找回来...
$finalarray = array(
'Red', 'Green',
'Red', 'Yellow',
'Red', 'Blue',
'Green', 'Yellow',
'Green', 'Blue',
'Yellow', 'Blue'
);
是否有内置的PHP功能来实现这一目标,或者有一种方法可以通过循环来实现?
答案 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
以外的其他内容更改。
对于上面的代码解释,我从源数组的顶部弹出一个元素,然后遍历幸存的元素以耦合一对。这样,我就不会将“红色”与“红色”配对,并且不会产生无序的重复项。