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

Posted

技术标签:

【中文标题】PHP - 生成数组中的所有项目组合【英文标题】:PHP - Generate all combinations of items in array 【发布时间】:2020-02-01 17:34:12 【问题描述】:

我有一个这样的 php 数组...

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

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

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

是否有内置的 PHP 功能可以实现这一点,或者有没有办法通过循环来做到这一点?

【问题讨论】:

algorithm that will take numbers or words and find all possible combinations的可能重复 How to generate in PHP all combinations of items in multiple arrays的可能重复 $finalarray 真的是你写的,还是成对的集合? 【参考方案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 之外的任何东西更改。

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

【讨论】:

【参考方案2】:

下面这个例子

 $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、2、3、4 数字 1、2、1、3、1、4、2、3、2、4、3、4 据我所知,那就是他想要什么。 他想要组合,而不是排列。这就是为什么它不是一个重复的问题 imo。

以上是关于PHP - 生成数组中的所有项目组合的主要内容,如果未能解决你的问题,请参考以下文章

php从给定数组生成所有组合

遍历 PHP 数组中的所有项目和子项目

如何从Python中列表的dict中的值生成所有组合

如何对数组php中的所有项目运行sql查询

如何在foreach循环中将数组结果组合在php中

数组元素的PHP组合