使用PHP实现数组的笛卡尔积来处理商品规格

在商城项目中必不可少的就是商品,同时商品也有各种规格,规格的价格库存也不同

在优化商城项目的时候,选择将商品的内容、规格、库存和价格分三个表来写。将多个规格的id合并存在一个字段中,按照从小到大的顺序来排列,使用逗号分隔

想了一下递归的实现,还是决定用笛卡尔积的方法来操作

什么是笛卡尔积呢?

笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员

下来就来处理商品规格的数据,每个商品有多少规格是不确定的,先定义一个数组

$arr = array(
    array('goods_spec_id' => 91, 'spec_id' => 1, 'spec_title' => '礼包', 'addr_title' => '椿萱款', 'goods_id' => 128),
    array('goods_spec_id' => 89, 'spec_id' => 1, 'spec_title' => '礼包', 'addr_title' => '女神款', 'goods_id' => 128),
    array('goods_spec_id' => 90, 'spec_id' => 1, 'spec_title' => '礼包', 'addr_title' => '少女款', 'goods_id' => 128),
    array('goods_spec_id' => 92, 'spec_id' => 7, 'spec_title' => '色号', 'addr_title' => 'R080', 'goods_id' => 128),
    array('goods_spec_id' => 93, 'spec_id' => 7, 'spec_title' => '色号', 'addr_title' => 'P081', 'goods_id' => 128),
    array('goods_spec_id' => 95, 'spec_id' => 5, 'spec_title' => '促销', 'addr_title' => '新品五折', 'goods_id' => 128),
    array('goods_spec_id' => 94, 'spec_id' => 7, 'spec_title' => '色号', 'addr_title' => 'R083', 'goods_id' => 128),
);

防止规格表的goods_spec_id排序没有顺序,所以我们定义一个方法来处理它,按照从小到大来排列,同时使用笛卡尔积去处理数组

function dikaer($arr) {
    $arr1 = array();
    $result = array_shift($arr);
    while ($arr2 = array_shift($arr)) {
        $arr1 = $result;
        $result = array();
        foreach ($arr1 as $v) {
            foreach ($arr2 as $v2) {
                if (!is_array($v)) {
                    $v = array($v);
                }

                if (!is_array($v2)) {
                    $v2 = array($v2);
                }

                $result[] = array_merge_recursive($v, $v2);
            }
        }
    }
    foreach ($result as $k => $v) {
        if (is_array($result[$k]['goods_spec_id'])) {
            sort($result[$k]['goods_spec_id']);
        }
    }
    return $result;
}

同时调用这个方法

$newArr = [];
foreach ($arr as $k => $v) {
    $specId = $v['spec_id'];
    unset($v['spec_id']);
    unset($v['spec_title']);
    unset($v['goods_id']);
    $newArr[$specId][] = $v;
}
$specArr = dikaer($newArr);

打印处理后的数据,看一下是什么样子

array(9) {
    [0]=>
    array(2) {
        ["goods_spec_id"]=>
    array(3) {
      [0]=>
      int(91)
      [1]=>
      int(92)
      [2]=>
      int(95)
    }
    ["addr_title"]=>
    array(3) {
            [0]=>
      string(15) "椿萱款"
            [1]=>
      string(4) "R080"
            [2]=>
      string(12) "新品五折"
    }
  }
//  ...部分省略
}

这样的数据基本上是我们想要的数据,但是还是要进一步处理

foreach ($specArr as $k => $v) {
    if (is_array($v['goods_spec_id'])) {
        $specArr[$k]['goods_spec_id'] = implode(',', $v['goods_spec_id']);
    }
    if (is_array($v['addr_title'])) {
        $specArr[$k]['addr_title'] = implode('', $v['addr_title']);
    }
}

var_dump($specArr);

使用PHP的 implode() 函数将数组元素组合为字符串,然后我们查看一下数据

array(9) {
  [0]=>
  array(2) {
        ["goods_spec_id"]=>
    string(8) "91,92,95"
        ["addr_title"]=>
    string(31) "椿萱款R080新品五折"
  }
  [1]=>
  array(2) {
        ["goods_spec_id"]=>
    string(8) "91,93,95"
        ["addr_title"]=>
    string(31) "椿萱款P081新品五折"
  }
//  ...部分省略
}

这样就得到了我们所需要的数据,将goods_spec_id存入数据库,addr_title用来在后台页面显示

沈唁志|一个PHPer的成长之路! 原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:使用PHP实现数组的笛卡尔积来处理商品规格

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python与爬虫

一行代码蒸发了¥6,447,277,680 人民币!

在他发表完言论没多久,2月美链(BEC)上交易所会暴涨4000%,后又暴跌。尽管他多次否认,聪明的网友早已扒出,他与BEC千丝万缕的关系。

11620
来自专栏编程一生

谈面试时从写一个单例开始究竟能问多深及终极解决方案

15240
来自专栏区块链大本营

当智能合约安全遇见《海上钢琴师》,自由与限制应是怎样的关系?

自1995年尼克萨博第一次提出智能合约理念以来,智能合约的功能延展越来越迅速,代码逻辑功能也越来越复杂。

8930
来自专栏HansBug's Lab

算法模板——sap网络最大流 3(递归+邻接表)

实现功能:同前 程序还是一如既往的优美,虽然比起邻接矩阵的稍稍长了那么些,不过没关系这是必然,但更重要的一个必然是——速度将是一个质的飞跃^_^(这里面的poi...

37870
来自专栏诸葛青云的专栏

面试中经常遇到10大C语言基础算法,最后一个是精髓

算法是一个程序和软件的灵魂,作为一名优秀的程序员,只有对一些基础的算法有着全面的掌握,才会在设计程序和编写代码的过程中显得得心应手。本文是近百个C语言算法系列的...

19300
来自专栏偏前端工程师的驿站

JS魔法堂:不完全国际化&本地化手册 之 理論篇

前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求——国际化&本地化。熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"...

24780
来自专栏猿人谷

map对象建立家族姓氏查询

题目:定义一个map对象,其元素的键是家族姓氏,而值是存储该家族孩子名字的vector对象。为这个map容器输入至少六个条目。通过基于家族姓氏的查询检测你的程序...

19980
来自专栏京东技术

京东资深架构师代码评审歪诗

21130
来自专栏一名叫大蕉的程序员

简约的JAVA版本MapReduce和日常No.25

昨天做了一个小调查,说看看想看些啥。大概的分布是这样的,一个1代表一个投票。看来还是2、3比较多。 11111 希望看到"算法"回复1。 111...

20650
来自专栏游戏开发那些事

【Unity游戏开发】Lua中的os.date和os.time函数

  最近马三在工作中经常使用到了lua 中的 os.date( ) 和 os.time( )函数,不过使用的时候都是不得其解,一般都是看项目里面怎么用,然后我就...

19940

扫码关注云+社区

领取腾讯云代金券