
本文介绍如何在 php 中对多维选项数组执行笛卡尔积运算,从而为电商产品批量生成带名称后缀与叠加价格的变体组合,适用于 csv 导入场景。
本文介绍如何在 php 中对多维选项数组执行笛卡尔积运算,从而为电商产品批量生成带名称后缀与叠加价格的变体组合,适用于 csv 导入场景。
在电商系统迁移或 CSV 批量导入场景中,常需将一个含多组可选属性(如颜色、尺寸)的产品,展开为所有可能的组合变体。这本质上是多维数组的笛卡尔积(Cartesian Product)问题:给定 n 个维度(如 'Color' => ['Red', 'Green'] 和 'Size' => ['Small', 'Medium']),需生成所有 (color, size) 的有序配对。
核心难点在于:不能简单嵌套 foreach(那只能处理固定层数),而需支持任意数量的选项维度(如还可能增加 'Material' 或 'Style')。解决方案是实现一个通用的 cartesian() 函数,它接受键值关联的选项数组(键为属性名,值为该属性所有可选项的索引数组),并返回所有组合的二维数组。
以下是完整、健壮且可复用的实现:
<?php
function cartesian($input)
{
$result = [[]];
foreach ($input as $key => $values) {
$append = [];
foreach ($result as $product) {
foreach ($values as $value) {
$product[$key] = $value;
$append[] = $product;
}
}
$result = $append;
}
return $result;
}
// 示例产品数据(注意:已修正原始代码中的冗余单引号,使用标准键名)
$product = [
'Name' => 'Test Product',
'Price' => 50,
'Options' => [
'Color' => [
'Red' => 10,
'Green' => 20,
],
'Size' => [
'Small' => 30,
'Medium' => 40,
],
],
];
// 步骤 1:提取每个选项维度的键名(即 'Red', 'Green', 'Small', 'Medium')
$optionsKeys = array_map('array_keys', $product['Options']);
// 步骤 2:生成所有组合(笛卡尔积)
$combinations = cartesian($optionsKeys);
// 步骤 3:为每个组合构造变体数组,计算叠加价格并格式化名称
$variations = array_map(function ($combo) use ($product) {
$totalExtra = 0;
// 遍历当前组合(如 ['Color' => 'Red', 'Size' => 'Small'])
foreach ($combo as $optionName => $optionValue) {
$totalExtra += $product['Options'][$optionName][$optionValue];
}
return [
'Name' => $product['Name'] . ' - ' . implode(', ', $combo),
'Regular price' => $product['Price'] + $totalExtra,
];
}, $combinations);
print_r($variations);
?>✅ 输出结果:
Array
(
[0] => Array
(
[Name] => Test Product - Red, Small
[Regular price] => 90
)
[1] => Array
(
[Name] => Test Product - Red, Medium
[Regular price] => 100
)
[2] => Array
(
[Name] => Test Product - Green, Small
[Regular price] => 100
)
[3] => Array
(
[Name] => Test Product - Green, Medium
[Regular price] => 110
)
)? 关键注意事项:
-
键名规范:确保
$product['Options']的键(如'Color','Size')为合法字符串,避免原始示例中带单引号的键名(如"'Color'"),否则会导致数组访问失败; -
扩展性:该方案天然支持任意数量的选项维度(只需在
'Options'中新增键即可),无需修改cartesian()函数; - 性能提示:若某维度选项极多(如 100 种颜色 × 100 种尺寸 = 10,000 组合),请评估内存占用,必要时可加入分批处理逻辑;
-
字段映射:最终输出键名(如
'Regular price')可根据目标平台(如 WooCommerce)要求灵活调整。
通过此方法,您可高效、可靠地将结构化产品数据转化为完整的变体集合,为后续导入、API 同步或前端渲染提供坚实基础。

















