如何在PHP中生成数组的所有唯一有序组合
PHP 生成数组的所有非重复无序组合(长度≥2)
给定数组:
$array = ['A', 'B', 'C', 'D'];
需要生成所有长度从2到原数组长度的唯一组合,要求排除逆序重复项(如只保留['A','B'],排除['B','A']),且子数组元素保持有序。4元素数组的组合总数为C(4,2)+C(4,3)+C(4,4)=6+4+1=11,与需求一致。
实现代码
function getUniqueCombinations($array) { $combinations = []; $arrayLength = count($array); // 遍历生成2到数组长度的所有组合 for ($combinationSize = 2; $combinationSize <= $arrayLength; $combinationSize++) { $combinations = array_merge($combinations, generateFixedSizeCombinations($array, $combinationSize)); } return $combinations; } function generateFixedSizeCombinations($array, $targetSize, $startIndex = 0, $currentCombination = []) { $result = []; $currentLength = count($currentCombination); // 当前组合长度达标,返回该组合 if ($currentLength === $targetSize) { return [$currentCombination]; } // 从startIndex开始遍历,避免生成重复的逆序组合 for ($i = $startIndex; $i < count($array); $i++) { $currentCombination[] = $array[$i]; // 递归生成后续元素,起始索引+1确保只选当前元素之后的项 $result = array_merge($result, generateFixedSizeCombinations($array, $targetSize, $i + 1, $currentCombination)); array_pop($currentCombination); } return $result; } // 测试示例 $array = ['A', 'B', 'C', 'D']; $new_array = getUniqueCombinations($array); // 输出结果 print_r($new_array);
代码说明
getUniqueCombinations:外层函数,遍历需要生成的组合长度(从2到原数组长度),合并各长度的组合结果。generateFixedSizeCombinations:递归生成指定长度的组合,通过startIndex控制元素选取的起始位置,确保每个组合的元素都是按原数组顺序选取,自然避免逆序重复。每次递归时,下一个元素的起始索引为当前索引+1,保证不会回头选取之前的元素,从而生成唯一的无序组合。
运行上述代码后,输出的$new_array与需求中的结果完全一致。
内容的提问来源于stack exchange,提问作者Tidjy
相关产品推荐
相关产品推荐

