在开发商城系统的时候,相信很多人遇到商品sku管理的问题。sku的生成方式是根据所有规格进行组合,也就是数学上的笛卡尔积。
生成字符串
<?php
function Cartesian($data){
$len = count($data);
for ($i = 0; $i< $len-1; $i++) {
if ($i === 0) {
$result = $data[0];
}
$temp = [];
foreach ($result as $res) {
foreach($data[$i+1] as $sec){
$temp[] = $res . '-' . $sec;
}
$result = $temp;
}
}
return $result;
}
$data = array(
array('白色','银色','玫瑰金'),
array('64G','128G'),
array('移动','电信','联通'),
array('国行','港版')
);
$result = Cartesian($data);
print_r($result);
?>
生成数组格式
<?php
function Cartesian($arr, $tmp = [], $n_arr = []){
foreach (array_shift($arr) as $v) {
$tmp[] = $v;
if ( $arr ) {
$n_arr = Cartesian($arr, $tmp, $n_arr);
} else {
$n_arr[] = $tmp;
}
array_pop($tmp);
}
return $n_arr;
}
$data = array(
array('白色','银色','玫瑰金'),
array('64G','128G'),
array('移动','电信','联通'),
array('国行','港版')
);
$result = Cartesian($data);
print_r($result);
?>
结果
Array
(
[0] => Array
(
[0] => 白色
[1] => 64G
[2] => 移动
[3] => 国行
)
[1] => Array
(
[0] => 白色
[1] => 64G
[2] => 移动
[3] => 港版
)
[2] => Array
(
[0] => 白色
[1] => 64G
[2] => 电信
[3] => 国行
)
[3] => Array
(
[0] => 白色
[1] => 64G
[2] => 电信
[3] => 港版
)
[4] => Array
(
[0] => 白色
[1] => 64G
[2] => 联通
[3] => 国行
)
[5] => Array
(
[0] => 白色
[1] => 64G
[2] => 联通
[3] => 港版
)
[6] => Array
(
[0] => 白色
[1] => 128G
[2] => 移动
[3] => 国行
)
[7] => Array
(
[0] => 白色
[1] => 128G
[2] => 移动
[3] => 港版
)
[8] => Array
(
[0] => 白色
[1] => 128G
[2] => 电信
[3] => 国行
)
[9] => Array
(
[0] => 白色
[1] => 128G
[2] => 电信
[3] => 港版
)
[10] => Array
(
[0] => 白色
[1] => 128G
[2] => 联通
[3] => 国行
)
[11] => Array
(
[0] => 白色
[1] => 128G
[2] => 联通
[3] => 港版
)
[12] => Array
(
[0] => 银色
[1] => 64G
[2] => 移动
[3] => 国行
)
[13] => Array
(
[0] => 银色
[1] => 64G
[2] => 移动
[3] => 港版
)
[14] => Array
(
[0] => 银色
[1] => 64G
[2] => 电信
[3] => 国行
)
[15] => Array
(
[0] => 银色
[1] => 64G
[2] => 电信
[3] => 港版
)
[16] => Array
(
[0] => 银色
[1] => 64G
[2] => 联通
[3] => 国行
)
[17] => Array
(
[0] => 银色
[1] => 64G
[2] => 联通
[3] => 港版
)
[18] => Array
(
[0] => 银色
[1] => 128G
[2] => 移动
[3] => 国行
)
[19] => Array
(
[0] => 银色
[1] => 128G
[2] => 移动
[3] => 港版
)
[20] => Array
(
[0] => 银色
[1] => 128G
[2] => 电信
[3] => 国行
)
[21] => Array
(
[0] => 银色
[1] => 128G
[2] => 电信
[3] => 港版
)
[22] => Array
(
[0] => 银色
[1] => 128G
[2] => 联通
[3] => 国行
)
[23] => Array
(
[0] => 银色
[1] => 128G
[2] => 联通
[3] => 港版
)
[24] => Array
(
[0] => 玫瑰金
[1] => 64G
[2] => 移动
[3] => 国行
)
[25] => Array
(
[0] => 玫瑰金
[1] => 64G
[2] => 移动
[3] => 港版
)
[26] => Array
(
[0] => 玫瑰金
[1] => 64G
[2] => 电信
[3] => 国行
)
[27] => Array
(
[0] => 玫瑰金
[1] => 64G
[2] => 电信
[3] => 港版
)
[28] => Array
(
[0] => 玫瑰金
[1] => 64G
[2] => 联通
[3] => 国行
)
[29] => Array
(
[0] => 玫瑰金
[1] => 64G
[2] => 联通
[3] => 港版
)
[30] => Array
(
[0] => 玫瑰金
[1] => 128G
[2] => 移动
[3] => 国行
)
[31] => Array
(
[0] => 玫瑰金
[1] => 128G
[2] => 移动
[3] => 港版
)
[32] => Array
(
[0] => 玫瑰金
[1] => 128G
[2] => 电信
[3] => 国行
)
[33] => Array
(
[0] => 玫瑰金
[1] => 128G
[2] => 电信
[3] => 港版
)
[34] => Array
(
[0] => 玫瑰金
[1] => 128G
[2] => 联通
[3] => 国行
)
[35] => Array
(
[0] => 玫瑰金
[1] => 128G
[2] => 联通
[3] => 港版
)
)
参考https://blog.csdn.net/bgxwpp/article/details/103678666