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:部分键对应多元素数组,先选元素再生成全排列
需求:输入数组中部分键对应多个元素,先从每个键下选一个元素得到所有组合,再对每个组合生成全排列。
实现思路:
- 计算各键元素的笛卡尔积,得到“各键选一个元素”的所有组合;
- 对每个笛卡尔积结果,调用全排列函数生成所有排列。
/** * 计算多维数组的笛卡尔积 * @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
相关产品推荐
相关产品推荐

