PHP排列组合通用算法包含五种方法:一、递归全排列(支持去重);二、字典序法生成下一个排列;三、DFS生成k元组合;四、位运算法迭代生成组合;五、多维数组笛卡尔积组合。

如果您需要在PHP中生成任意数组的所有排列或指定长度的组合,但缺乏统一、可复用的算法结构,则可能是由于未区分排列与组合的数学定义及实现路径。以下是实现排列组合通用算法的多种方法:
一、递归全排列(支持去重)
该方法基于回溯思想,每次固定一个元素于当前位置,对剩余元素递归求解;通过排序预处理与相邻值跳过逻辑,可自动过滤重复排列,适用于含重复元素的输入数组。
1、对原始数组进行升序排序,确保相同元素相邻。
2、定义函数permuteUnique,接收数组引用、起始索引和结果容器参数。
3、当起始索引等于数组长度时,将当前数组快照存入结果数组并返回。
4、从起始索引开始遍历至末尾,若当前索引大于起始索引且元素值等于前一元素,则跳过本次循环以避免重复排列。
5、交换起始索引与当前索引处的元素。
6、递归调用自身,起始索引加1。
7、执行回溯:再次交换两元素,恢复原数组状态。
二、字典序法生成下一个排列
该方法不依赖递归栈,适合内存受限场景;要求输入数组初始为升序,每次调用生成严格字典序更大的下一个排列,直至无法生成为止,从而遍历全部唯一排列。
1、从右向左扫描,找到第一个满足$arr[i] 的位置i;若不存在,则已为最大字典序排列。
2、再次从右向左扫描,找到第一个满足$arr[j] > $arr[i]的位置j。
3、交换$arr[i]与$arr[j]。
4、将$arr[i + 1]至数组末尾的子数组完全反转。
5、重复步骤1–4,直到步骤1中找不到降序位置。
三、深度优先搜索生成k元组合
该方法通过DFS枚举所有长度为k的子集,不考虑顺序,仅关注元素选取;使用起始索引控制搜索范围,避免重复选择同一位置元素,也防止生成顺序不同但内容相同的组合。
1、定义函数combine,接收数组、目标长度k、当前组合临时数组、起始索引和结果容器。
2、若当前组合长度等于k,则将其副本存入结果容器并返回。
3、从起始索引开始遍历至数组末尾。
4、将当前元素压入临时组合数组。
5、递归调用combine,起始索引设为i + 1(确保每个元素最多被选一次且不逆序选取)。
6、从临时组合数组中弹出最后元素,完成回溯。
四、迭代式组合生成(基于位运算法)
该方法将组合问题映射为n位二进制数中恰好含k个1的枚举问题;适用于n ≤ 32的小规模数组,无需递归,逻辑直观,易于理解与调试。
1、计算数组长度n,确认k ≤ n且k ≥ 0,否则直接返回空结果。
2、初始化整数$mask = (1 ,即最低k位为1的掩码。
3、当$mask 时持续循环。
4、提取$mask中为1的每一位位置i,将$arr[i]加入当前组合。
5、使用位运算计算下一个含k个1的最小整数:$smallest = $mask & -$mask,$ripple = $mask + $smallest,$new_smallest = $ripple & -$ripple,$mask = $ripple | ((($new_smallest / $smallest) >> 1) - 1)。
6、将当前组合存入结果容器,继续循环。
五、多维数组扁平化后全组合生成
当输入为多维数组(如每个维度代表一类可选项),需从每层取一个元素构成元组时,该方法通过嵌套循环或队列展开方式生成笛卡尔积形式的所有组合,适用于表单字段联动、配置矩阵等实际场景。
1、将多维数组首项作为初始结果集。
2、从第二维开始逐层迭代,对当前结果集中每一子数组,与当前维度的每个元素拼接生成新子数组。
3、每次拼接后,将新子数组推入临时结果集,替换原结果集。
4、遍历完所有维度后,最终结果集即为全部笛卡尔积组合。
5、若某维度为空,则最终结果集清空并终止后续处理。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











