You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 19:13:12