专栏首页沈唁志使用PHP实现数组的笛卡尔积来处理商品规格

使用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 条评论
登录 后参与评论

相关文章

  • PHP中多维数组自定义排序uasort()

    沈唁
  • 程序员的Mac入门-配置PHP开发环境

    沈唁志,一个PHPer的成长之路! 任何个人或团体,未经允许禁止转载本文:《程序员的Mac入门-配置PHP开发环境》,谢谢合作!

    沈唁
  • 各种IE(IE6-IE10)兼容问题一行代码搞定

    沈唁
  • python-pptx的基本使用

    在ppt中所有的元素均被当成一个shape,slide.shapes表示幻灯片类中的模型类,placeholders中为每个模型,采用slide_layouts...

    py3study
  • java源码之二叉查找树与二叉平衡树

    二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树:

    Java阿呆
  • 防止vue文件中的样式出现‘污染’情况(html5 scoped特性)

    在vue中,如果把样式写在vue文件的 style中,可能会出现样式污染的情况,这是要把写样式的标签

    lin_zone
  • Prometheus:关于监控

    1、监控的堆栈: 业务逻辑 应用程序 操作系统 2、Prometheus 是 Pull的方式 3、USE方法:针对每一个资源,检查使用率、饱和度和错误...

    用户5760343
  • 安卓调试神器-Stetho的使用

    我们都知道对于Web开发者来说 Chrome是个十分方便的调试神器,但是对于Android来说,可能之前的网络调试大多我们都用PostMan或者类似的工具进行调...

    Demo_Yang
  • 设计模式行为型:观察者模式(ObserverPattern)

    定义对象之间的一种一对多依赖关系,使得每一个对象发生状态的变化时,其相关依赖对象皆得到通知并被自动更新,又称为发布-订阅模式、模型-视图模式、源-监听器模式或从...

    码农架构
  • 【手撕算法】PatchMatch图像修复算法

    PatchMatch 算法就是一个找近似最近邻(Approximate Nearest neigbhor)的方法,要比其他ANN算法快上10倍+。

    AI算法与图像处理

扫码关注云+社区

领取腾讯云代金券