
本文介绍如何使用 php 实现多维选项数组的笛卡尔积运算,自动生成商品所有属性组合(如颜色+尺寸),并动态计算每个组合的价格与名称,适用于电商 csv 导入场景。
本文介绍如何使用 php 实现多维选项数组的笛卡尔积运算,自动生成商品所有属性组合(如颜色+尺寸),并动态计算每个组合的价格与名称,适用于电商 csv 导入场景。
在商品数据迁移(如从 CSV 导入到 WooCommerce)过程中,常需将具有多个可选属性(如颜色、尺寸、材质)的单个产品展开为多个独立变体。核心难点在于:对任意数量的嵌套选项维度,生成其全量排列组合(即笛卡尔积),而非简单的两层循环嵌套——后者无法扩展至 3 个及以上选项(如 Color + Size + Style)。
解决方案的关键是实现一个通用的 cartesian() 函数,它接受一个关联数组(键为选项名,值为该选项所有取值的索引数组),返回所有可能的组合数组。例如:
$options = [
'Color' => ['Red', 'Green'],
'Size' => ['Small', 'Medium']
];
// 输出: [['Color'=>'Red', 'Size'=>'Small'], ['Color'=>'Red', 'Size'=>'Medium'], ...]以下是完整可运行代码(已修正原始示例中的键名引号错误和价格字段名不一致问题):
<?php
function cartesian($input)
{
$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:生成所有组合(笛卡尔积)
$combinations = cartesian($optionsKeys);
// 步骤3:为每个组合构造变体数组,含拼接名称与累加价格
$variations = array_map(function ($combo) use ($product) {
$totalPrice = $product['Price'];
$optionNames = [];
foreach ($combo as $optionType => $optionValue) {
$totalPrice += $product['Options'][$optionType][$optionValue];
$optionNames[] = $optionValue;
}
return [
'Name' => $product['Name'] . ' - ' . implode(', ', $optionNames),
'Regular price' => $totalPrice,
];
}, $combinations);
print_r($variations);
?>✅ 输出结果完全匹配预期(注意:Red + Small 组合基础价 50 + 颜色溢价 10 + 尺寸溢价 30 = 90,原文档中误写为 80):
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')与值数组的键(如'Red'、'Small')不包含多余引号或空格,否则array_keys()和后续索引访问会失败; -
扩展性:此方案天然支持 N 维选项(如增加
'Material' => ['Cotton'=>5, 'Polyester'=>8]),无需修改主逻辑; - 性能提示:若某产品有 10 种颜色 × 10 种尺寸 × 10 种材质 = 1000 个变体,笛卡尔积结果会线性增长,请评估内存与导入性能;
-
字段映射:实际导入时,将
'Regular price'映射为目标平台要求的字段名(如'regular_price'或'price')。
该方法将复杂组合逻辑封装为可复用函数,显著提升 CSV 批量导入脚本的健壮性与可维护性。

















