PHP实现多子数组单元素选择的组合计算及表格展示
嘿,这需求我熟!你要的是从4个都是[1,2,3]的子数组里各挑一个元素,生成所有可能的组合,还得用表格展示对吧?安排!
需求明确
咱们先理清楚:4个子数组,每个都有1、2、3三个选项,总共有3^4=81种组合,比如你提到的1111、1222这些都包含在内。
PHP实现方案
我写了一个通用的笛卡尔积函数来生成所有组合,这样就算以后子数组数量或者元素变了,代码也能复用。直接看代码:
<?php // 初始化你的数组结构,4个子数组都是[1,2,3] $sourceArrays = [ [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3] ]; // 生成笛卡尔积的函数,适用于任意数量的子数组 function generateCartesianProduct($arrays) { $result = [[]]; foreach ($arrays as $currentArray) { $tempCombination = []; // 把现有组合和当前子数组的每个元素拼接 foreach ($result as $existingCombo) { foreach ($currentArray as $item) { $tempCombination[] = array_merge($existingCombo, [$item]); } } $result = $tempCombination; } // 把每个组合数组转成字符串(比如[1,1,1,1]变成"1111") return array_map(function($combo) { return implode('', $combo); }, $result); } // 获取所有组合 $allCombinations = generateCartesianProduct($sourceArrays); // 输出HTML表格,每行放9个组合,避免表格太宽 echo "<table style='border-collapse: collapse;'>"; $columnCount = 0; echo "<tr>"; foreach ($allCombinations as $combo) { echo "<td style='border: 1px solid #ccc; padding: 4px 8px;'>{$combo}</td>"; $columnCount++; // 每9个换一行 if ($columnCount % 9 === 0) { echo "</tr><tr>"; } } // 闭合最后一行 if ($columnCount % 9 !== 0) { echo "</tr>"; } echo "</table>"; ?>
代码说明
generateCartesianProduct函数是核心,通过嵌套循环逐层生成所有可能的组合,这是处理多数组组合的标准方法,扩展性很强。- 最后把每个组合数组转成字符串,用表格输出时每行放9个,这样看起来更整齐,不会横向拉得太长。
- 如果需要在命令行输出,只需要把HTML表格的部分换成循环输出字符串,比如每行打印9个组合用空格分隔就行。
输出示例(部分)
这里放一小部分表格效果,完整的会有9行9列共81个组合:
| 1111 | 1112 | 1113 | 1121 | 1122 | 1123 | 1131 | 1132 | 1133 |
|---|---|---|---|---|---|---|---|---|
| 1211 | 1212 | 1213 | 1221 | 1222 | 1223 | 1231 | 1232 | 1233 |
| 1311 | 1312 | 1313 | 1321 | 1322 | 1323 | 1331 | 1332 | 1333 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 3311 | 3312 | 3313 | 3321 | 3322 | 3323 | 3331 | 3332 | 3333 |
内容的提问来源于stack exchange,提问作者el valuta
相关产品推荐
相关产品推荐

