
本文介绍使用 php 实现多维选项数组的笛卡尔积运算,从而批量生成商品变体(如颜色+尺寸组合),并自动计算叠加价格,适用于 csv 导入场景下的电商产品变体构建。
本文介绍使用 php 实现多维选项数组的笛卡尔积运算,从而批量生成商品变体(如颜色+尺寸组合),并自动计算叠加价格,适用于 csv 导入场景下的电商产品变体构建。
在电商系统迁移或 CSV 批量导入过程中,常需将含多组可选属性(如颜色、尺寸、材质)的产品原始数据,展开为所有合法组合的独立变体。这本质上是求多个一维数组的笛卡尔积(Cartesian Product),而非简单嵌套循环——因为选项维度数量不固定(可能有2个、3个甚至更多属性),需通用算法支持。
核心思路分三步:
-
提取各选项维度的键名组合(如
['Color' => ['Red','Green'], 'Size' => ['Small','Medium']]→ 提取[['Red','Green'], ['Small','Medium']]); -
执行笛卡尔积运算,生成所有键名组合(如
[['Red','Small'], ['Red','Medium'], ['Green','Small'], ['Green','Medium']]); - 映射回原始价格并构造最终变体,拼接名称、累加价格。
以下是完整、可直接运行的解决方案:
<?php function cartesian($input): array
{
$result = [[]];
foreach ($input as $key => $values) {
$append = [];
foreach ($result as $product) {
foreach ($values as $item) {
$product[$key] = $item;
$append[] = $product;
}
}
$result = $append;
}
return $result;
}
// 示例产品数据(注意:已修正原始代码中的引号问题,使用标准字符串键)
$product = [
'Name' => 'Test Product',
'Price' => 50,
'Options' => [
'Color' => [
'Red' => 10,
'Green' => 20,
],
'Size' => [
'Small' => 30,
'Medium' => 40,
],
],
];
// 步骤1:提取每个选项维度的键名(即所有可选值)
$optionsKeys = array_map('array_keys', $product['Options']);
// 步骤2:计算笛卡尔积 → 得到所有组合(每个元素是关联数组,如 ['Color'=>'Red','Size'=>'Small'])
$combinations = cartesian($optionsKeys);
// 步骤3:将每种组合映射为变体数组
$variations = array_map(function ($combo) use ($product) {
$totalAddon = 0;
$optionLabels = [];
// 遍历当前组合,累加对应价格,并收集显示标签
foreach ($combo as $optionName => $optionValue) {
$totalAddon += $product['Options'][$optionName][$optionValue];
$optionLabels[] = $optionValue;
}
return [
'Name' => $product['Name'] . ' - ' . implode(', ', $optionLabels),
'Regular price' => $product['Price'] + $totalAddon,
];
}, $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
)
)
⚠️ 关键注意事项:
- 原始问题中数组键名带多余单引号(如
"'Color'")属于数据解析错误,务必在 CSV 解析阶段清理键名,确保使用'Color'而非"'Color'"; -
cartesian()函数支持任意数量的选项维度(如增加'Material' => ['Cotton'=>5, 'Polyester'=>8]),无需修改逻辑; - 若需兼容空选项(如某产品无尺寸限制),可在
array_map('array_keys', ...)前添加判断,跳过空数组或提供默认值; - 生产环境建议封装为独立类(如
ProductVariationGenerator),并增加类型声明与异常处理。
该方案兼顾可读性、扩展性与健壮性,是处理多属性商品变体生成的标准实践。










