侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

在php开发商品sku功能时实现批量生成sku组合的两种方式介绍

php  /  管理员 发布于 2年前   738

近期在开发一个电商系统,做到了商品模块。虽然增删改查在所难免,但是商品这块更多的是 js 的调用等效果。还有更为重要的就是商品 sku 的批量生成与组合了。

不同的系统有不同的需求,以下的需求就是要添加完各种规格后批量生成 sku 的。

sku1.png

效果:

sku2.png

页面代码这里就不说了,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

  • 上一条:
    使用composer来安装私有php包的流程步骤
    下一条:
    在go语言中实现重置缓冲区实例代码
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客