PHP数组组合算法开发需求:仅跨数组元素生成组合
多数组跨元素组合算法解决方案
问题描述
需要开发特定的数组组合算法,要求仅生成来自不同数组元素的组合,不能出现同一数组内元素的组合(例如不能出现A12x,因1和2来自同一数组)。示例输入:
['A', 'B', 'C'], [1,2,3], ['x','y'],期望输出包含单个元素、两数组元素组合、三数组元素组合(如A、A1、A1x等)。本人尝试了一段PHP代码但未得到正确结果,求助解决方案。
附尝试代码:
<?php // Enter your code here, enjoy! $arrayGlobal = [['A', 'B'], ['1', '2', '3'], ['x', 'y']]; $result = []; for($i=0; $i<count($arrayGlobal); $i++){ $tab= $arrayGlobal[$i]; for($j=0;$j<count($tab); $j++) { $result[] = $tab[$j]; for($k=$i+1; $k<count($arrayGlobal); $k++) { $nextTab = $arrayGlobal[$k]; for($y=0; $y<count($nextTab); $y++) { $result[] = $tab[$j].'-'.$nextTab[$y]; } } } } print_r($result);
解决方案
你的代码仅生成了单个元素和两个数组的组合,遗漏了三个及以上数组的跨组合(比如A-1-x这类)。要覆盖所有符合要求的组合,需要用递归方式遍历所有非空的、元素来自不同数组的子集组合。
以下是修正后的PHP代码:
<?php $arrayGlobal = [['A', 'B'], ['1', '2', '3'], ['x', 'y']]; $result = []; // 递归生成所有跨数组组合 function generateCombinations($arrays, $currentIndex = 0, $currentCombination = '') { global $result; // 非空组合直接加入结果集 if ($currentCombination !== '') { $result[] = $currentCombination; } // 遍历当前索引之后的数组,避免重复取同一数组元素 for ($i = $currentIndex; $i < count($arrays); $i++) { foreach ($arrays[$i] as $element) { $newCombination = $currentCombination === '' ? $element : $currentCombination . '-' . $element; // 递归处理下一个数组,确保不回头取之前的数组 generateCombinations($arrays, $i + 1, $newCombination); } } } generateCombinations($arrayGlobal); print_r($result);
代码说明
- 递归遍历每个数组,每次递归仅处理当前索引之后的数组,彻底避免从同一数组中取多个元素
- 所有非空组合都会被加入结果集,覆盖单个元素、跨两数组、跨三数组的所有合法情况
- 组合元素间用
-分隔,和你原代码的格式保持一致
测试结果
运行上述代码后,输入[['A', 'B'], ['1', '2', '3'], ['x', 'y']]会得到以下结果:
Array ( [0] => A [1] => A-1 [2] => A-1-x [3] => A-1-y [4] => A-2 [5] => A-2-x [6] => A-2-y [7] => A-3 [8] => A-3-x [9] => A-3-y [10] => A-x [11] => A-y [12] => B [13] => B-1 [14] => B-1-x [15] => B-1-y [16] => B-2 [17] => B-2-x [18] => B-2-y [19] => B-3 [20] => B-3-x [21] => B-3-y [22] => B-x [23] => B-y [24] => 1 [25] => 1-x [26] => 1-y [27] => 2 [28] => 2-x [29] => 2-y [30] => 3 [31] => 3-x [32] => 3-y [33] => x [34] => y )
完全符合需求,包含所有合法组合且无同一数组内元素的组合。
内容的提问来源于stack exchange,提问作者Any
相关产品推荐
相关产品推荐

