笛卡尔积是多个数组所有可能的有序组合,每个组合从各数组中取一个元素;php可通过递归(逻辑清晰)或迭代(避免栈溢出)实现,结果为二维数组,需注意指数级增长与空数组处理。

PHP 实现数组笛卡尔积,核心是递归或迭代组合多个一维数组的所有可能元素组合,结果为二维数组,每项是一个完整组合。
什么是笛卡尔积(在数组场景下)
给定若干个数组,如:
$a = [1, 2];
$b = ['x', 'y'];
$c = ['A'];
它们的笛卡尔积是所有有序三元组的集合:
[[1,'x','A'], [1,'y','A'], [2,'x','A'], [2,'y','A']]
即每个结果子数组都从原数组中各取一个元素,不遗漏、不重复。
递归实现(推荐,逻辑清晰)
将问题拆解为:前 n−1 个数组的笛卡尔积,再与第 n 个数组做两两组合。
- 基准情况:输入为空数组,返回 [[]](含一个空数组的结果)
- 递归步骤:取第一个数组,对剩余数组递归求积,再用嵌套循环将首数组每个元素与后续所有组合拼接
代码示例:
function cartesianProduct($arrays) {
if (empty($arrays)) return [[]];
$first = array_shift($arrays);
$rest = cartesianProduct($arrays);
$result = [];
foreach ($first as $v) {
foreach ($rest as $r) {
$result[] = array_merge([$v], $r);
}
}
return $result;
}
迭代实现(避免递归深度限制)
适用于数组较多、担心栈溢出的场景。从空结果集开始,逐个合并数组。
立即学习“PHP免费学习笔记(深入)”;
- 初始化结果为 [[]]
- 遍历每个输入数组,对当前结果中每个子数组,分别追加该数组的每个元素,生成新结果
- 每次合并后更新结果集,直到处理完所有数组
代码示例:
function cartesianProductIterative($arrays) {
$result = [[]];
foreach ($arrays as $array) {
$temp = [];
foreach ($result as $res) {
foreach ($array as $item) {
$temp[] = array_merge($res, [$item]);
}
}
$result = $temp;
}
return $result;
}
注意事项与优化建议
笛卡尔积结果数量呈指数级增长(n₁ × n₂ × … × nₖ),务必注意性能边界。
- 提前校验输入:过滤空数组,否则结果为空(因任一数组为空,整体积为空)
- 若只需遍历而非全量保存,可改造成生成器函数,节省内存
- 键名默认丢失;如需保留原始键,可在 array_merge 前使用 + 或手动构造关联结构
- PHP 7.4+ 可用展开语法简化: [...$res, $item] 替代 array_merge($res, [$item])











