在php开发商品sku功能时实现批量生成sku组合的两种方式介绍
php  /  管理员 发布于 1年前   510
近期在开发一个电商系统,做到了商品模块。虽然增删改查在所难免,但是商品这块更多的是 js 的调用等效果。还有更为重要的就是商品 sku 的批量生成与组合了。
不同的系统有不同的需求,以下的需求就是要添加完各种规格后批量生成 sku 的。
效果:
页面代码这里就不说了,sku 的生成方式是根据所有规格进行组合,也就是数学上的笛卡尔积,
我用 php 写了两种方式,记录一下。
第一种,生成字符串
<?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) {
//数组第二个值...$i+1
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);
?>
实际开发中,你只要生成上面的二维数组就可以组合了,效果如下:
Array
(
[0] => 白色-64G-移动-国行
[1] => 白色-64G-移动-港版
[2] => 白色-64G-电信-国行
[3] => 白色-64G-电信-港版
[4] => 白色-64G-联通-国行
[5] => 白色-64G-联通-港版
[6] => 白色-128G-移动-国行
[7] => 白色-128G-移动-港版
[8] => 白色-128G-电信-国行
[9] => 白色-128G-电信-港版
[10] => 白色-128G-联通-国行
[11] => 白色-128G-联通-港版
[12] => 银色-64G-移动-国行
[13] => 银色-64G-移动-港版
[14] => 银色-64G-电信-国行
[15] => 银色-64G-电信-港版
[16] => 银色-64G-联通-国行
[17] => 银色-64G-联通-港版
[18] => 银色-128G-移动-国行
[19] => 银色-128G-移动-港版
[20] => 银色-128G-电信-国行
[21] => 银色-128G-电信-港版
[22] => 银色-128G-联通-国行
[23] => 银色-128G-联通-港版
[24] => 玫瑰金-64G-移动-国行
[25] => 玫瑰金-64G-移动-港版
[26] => 玫瑰金-64G-电信-国行
[27] => 玫瑰金-64G-电信-港版
[28] => 玫瑰金-64G-联通-国行
[29] => 玫瑰金-64G-联通-港版
[30] => 玫瑰金-128G-移动-国行
[31] => 玫瑰金-128G-移动-港版
[32] => 玫瑰金-128G-电信-国行
[33] => 玫瑰金-128G-电信-港版
[34] => 玫瑰金-128G-联通-国行
[35] => 玫瑰金-128G-联通-港版
)
第二种,生成数组格式
<?php
function Cartesian($data){
$len = count($data);
// 取第一个集合数组值
$result = $data[0];
for ($i = 0; $i< $len-1; $i++) {
$arr1 = $result;
$result = [];
// 数组第一个值和第二个值组合
foreach ($arr1 as $res) {
//数组第二个值...$i+1
foreach($data[$i+1] as $sec){
if(!is_array($res)) {
$res = array($res);
}
if(!is_array($sec)){
$sec = array($sec);
}
$result[] = array_merge_recursive($res,$sec);
}
}
}
return $result;
}
//需要计算的数组
$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://learnku.com/articles/73599
原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..博主 在
科学上网翻墙之v2rayN-Core客户端免费公益节点使用教程中评论 @ mashrdn 多切换几个节点测试,免费ssr是没那么稳..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号