PHP如何递归遍历可变结构数组生成所有子数组元素的全组合?
PHP 不定结构关联数组全量组合生成实现
核心逻辑
通过递归逐维处理关联数组的子数组:
- 初始状态组合为包含1个空字符串的数组
- 每次取出当前待处理的第一个子数组,将其每个元素和已有所有组合做拼接
- 剩余子数组递归执行上述逻辑,直到所有子数组处理完毕,得到全量组合
完整代码实现
function generateAllCombinations(array $arr): array { // 递归终止条件:所有子数组处理完毕 if (empty($arr)) { return ['']; } // 取出第一个子数组,剩余数组留作递归处理 $firstChild = array_shift($arr); // 递归处理剩余子数组,拿到后续维度的所有组合 $restCombinations = generateAllCombinations($arr); $result = []; // 遍历当前维度每个元素,和后续所有组合拼接 foreach ($firstChild as $item) { foreach ($restCombinations as $combination) { // 自动处理首尾多余空格 $result[] = trim($item . ' ' . $combination); } } return $result; }
使用示例
// 示例输入数组 $values = [ 'sizes' => ['S', 'M', 'L', 'XL'], 'colors' => ['Red', 'Blue', 'Green'], 'types' => ['Short', 'Long'], ]; $allCombinations = generateAllCombinations($values); // 遍历输出所有组合 foreach ($allCombinations as $str) { echo $str . PHP_EOL; }
适配说明
- 支持任意数量的子数组:不管是2个、3个还是更多维度的子数组都可以正常处理
- 支持单元素子数组:如果某个子数组只有1个元素,也会正常拼接到所有组合中
- 不依赖关联数组的键名:不管键名是什么都不影响组合生成逻辑
- 如需保留维度对应的键名信息,可修改拼接逻辑返回结构化数组,而非直接拼接字符串。
内容的提问来源于stack exchange,提问作者Alex197
相关产品推荐
相关产品推荐

