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

PHP动态生成数组元素全排列组合解决方案求助

PHP实现动态数组的全排列组合(两种场景)

场景1:所有键对应单元素数组,生成元素的全排列

需求:输入数组的每个键仅对应一个元素,生成这些元素的所有不同顺序排列。

实现思路:先提取数组中的所有元素值,再通过递归方式生成全排列。

/**
 * 生成数组的全排列
 * @param array $items 待排列的元素数组
 * @return array 所有排列结果
 */
function generatePermutations(array $items): array {
    $result = [];

    // 递归终止:只剩一个元素直接返回
    if (count($items) === 1) {
        return [$items];
    }

    foreach ($items as $key => $item) {
        // 取出当前元素,剩余元素递归排列
        $remaining = $items;
        unset($remaining[$key]);
        $remainingPerms = generatePermutations(array_values($remaining));
        
        // 合并当前元素与剩余排列结果
        foreach ($remainingPerms as $perm) {
            array_unshift($perm, $item);
            $result[] = $perm;
        }
    }

    return $result;
}

// 示例输入
$input1 = [
    'a' => ['apple'],
    'b' => ['banana'],
    'c' => ['cherry']
];

// 提取元素并生成全排列
$elements = array_column($input1, 0);
$permutations1 = generatePermutations($elements);

// 输出结果
echo "场景1输出:\n";
foreach ($permutations1 as $perm) {
    echo implode(', ', $perm) . "\n";
}

输出示例:

场景1输出:
apple, banana, cherry
apple, cherry, banana
banana, apple, cherry
banana, cherry, apple
cherry, apple, banana
cherry, banana, apple

场景2:部分键对应多元素数组,先选元素再生成全排列

需求:输入数组中部分键对应多个元素,先从每个键下选一个元素得到所有组合,再对每个组合生成全排列。

实现思路:

  1. 计算各键元素的笛卡尔积,得到“各键选一个元素”的所有组合;
  2. 对每个笛卡尔积结果,调用全排列函数生成所有排列。
/**
 * 计算多维数组的笛卡尔积
 * @param array $arrays 待计算笛卡尔积的数组集合
 * @return array 笛卡尔积结果
 */
function generateCartesianProduct(array $arrays): array {
    $result = [[]];

    foreach ($arrays as $array) {
        $temp = [];
        foreach ($result as $product) {
            foreach ($array as $item) {
                $temp[] = array_merge($product, [$item]);
            }
        }
        $result = $temp;
    }

    return $result;
}

// 示例输入
$input2 = [
    'a' => ['apple', 'apricot'],
    'b' => ['banana'],
    'c' => ['cherry', 'coconut']
];

// 步骤1:生成笛卡尔积
$cartesianProducts = generateCartesianProduct($input2);

// 步骤2:对每个组合生成全排列
$finalResults = [];
foreach ($cartesianProducts as $product) {
    $perms = generatePermutations($product);
    $finalResults = array_merge($finalResults, $perms);
}

// 输出结果
echo "\n场景2输出:\n";
foreach ($finalResults as $perm) {
    echo implode(', ', $perm) . "\n";
}

输出示例(部分):

场景2输出:
apple, banana, cherry
apple, cherry, banana
banana, apple, cherry
banana, cherry, apple
cherry, apple, banana
cherry, banana, apple
apple, banana, coconut
apple, coconut, banana
banana, apple, coconut
...(剩余排列略)

代码说明

  • generatePermutations:递归实现全排列,通过每次取出一个元素,对剩余元素递归排列后合并结果;
  • generateCartesianProduct:迭代实现笛卡尔积,逐层合并数组生成所有组合;
  • 两个函数均为通用实现,可适配任意长度的动态输入数组。

内容的提问来源于stack exchange,提问作者Trixx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:52:38