如何生成两个PHP数组的全部分配组合(所有水果均被食用)
解决方案
你的核心需求是生成所有可能的水果分配组合——每个水果可以被任意一个人食用(允许同一个人吃多个水果),最终要覆盖所有人数^水果数种可能的分配情况。以下是实现代码:
$people = ['Alice', 'Bob']; $fruit = ['apple', 'banana']; $allCombinations = []; function generateAssignments($people, $remainingFruits, $currentAssignment, &$allCombinations, $fruit) { // 当所有水果都分配完毕,生成对应句子组合 if ($remainingFruits == 0) { $combination = []; foreach ($currentAssignment as $index => $person) { $combination[] = "$person ate the {$fruit[$index]}"; } $allCombinations[] = $combination; return; } // 遍历每个人员,将当前水果分配给他,递归生成后续分配 foreach ($people as $person) { $newAssignment = $currentAssignment; $newAssignment[] = $person; generateAssignments($people, $remainingFruits - 1, $newAssignment, $allCombinations, $fruit); } } // 初始调用:剩余需分配的水果数为水果数组长度,当前分配为空 generateAssignments($people, count($fruit), [], $allCombinations, $fruit); // 输出所有组合 foreach ($allCombinations as $comb) { echo '<p>' . json_encode($comb) . '</p>'; }
代码逻辑说明
- 递归函数
generateAssignments负责生成所有人员分配序列:每个序列的长度等于水果数量,每个元素对应一个水果的食用者。 - 当剩余分配的水果数为0时,将分配序列与水果一一对应,生成“谁吃了哪种水果”的句子数组,存入结果集合。
- 遍历每个人员,将当前水果分配给该人员后,递归处理剩余水果,直到所有水果分配完成。
- 最终输出的结果会覆盖所有可能的分配情况,包括单个人吃所有水果、多人分吃水果的混合场景。
原代码问题分析
你之前的代码仅遍历每个人员,让该人员吃掉所有水果,只生成了人数种单一分配情况,没有考虑水果可以分给不同人员的组合,因此缺少了大部分符合要求的分配场景。
内容的提问来源于stack exchange,提问作者Scott Hardie
相关产品推荐
相关产品推荐

