php批量生成电商sku列表(笛卡尔积)

在开发商城系统的时候,相信很多人遇到商品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) {
            //数组第二个值...$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);
?>

生成数组格式

<?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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值