php 多组数组算所有的组合形式

深入研究下商城如何为多属性多库存的商品计算组合的方式

比如一个商品有三个属性

颜色

红色、黄色

尺寸

M、L、XL

材质

轻、重

一开始没有考虑周到,分别给每个属性都加了一个价格,库存

比如选择商品时选择不同颜色,获取不同价格,但是当产品有多个属性时这种方式就有问题了,如

选择 红色,M,轻 这种多属性结合一起的就不能使用一个属性一个价格

这个时候需要为每个属性可能出现的组合设置价格,库存。如:

红色、M、轻  10元

红色、L、轻  12 元

黄色、M、轻  12 元
...

伪代码如下

// 颜色
$A = ['红色','黄色'];
$B = ['M','L','XL'];
$C = ['轻','重'];

需要计算出这三个数组的组合方式

$res = array();
foreach($A as $ak=>$av){
	foreach($B as $bk=>$bv)
	{
		foreach($C as $ck=>$cv)
		{
			$res[] = $av.'_'.$bv.'_'.$cv;
		}
	}	
}

查看结果。一共 2*3*2 12种组合方式

array(12) {
  [0] => string(12) "红色_M_轻"
  [1] => string(12) "红色_M_重"
  [2] => string(12) "红色_L_轻"
  [3] => string(12) "红色_L_重"
  [4] => string(13) "红色_XL_轻"
  [5] => string(13) "红色_XL_重"
  [6] => string(12) "黄色_M_轻"
  [7] => string(12) "黄色_M_重"
  [8] => string(12) "黄色_L_轻"
  [9] => string(12) "黄色_L_重"
  [10] => string(13) "黄色_XL_轻"
  [11] => string(13) "黄色_XL_重"
}

但是由于属性属于不确定性,这种计算方式需要每一个属性一个循环不现实,所以需要改进代码

$A = ['红色','黄色'];
$B = ['M','L','XL'];
$C = ['轻','重'];

// 先将各属性值处理成一个整体
$list['A'] = $A;
$list['B'] = $B;
$list['C'] = $C;

$res = array();
foreach ($list as $k => $v) {
    $res = getCombinationToString($v);
}

/**
 * 获取组合的结果
 * [@author](https://my.oschina.net/arthor) 18y
 * @anotherdate 2019-04-27T09:49:44+0800
 * [@param](https://my.oschina.net/u/2303379)       array                         $val 组合内容
 * [@return](https://my.oschina.net/u/556800)      [type]                        [description]
 */
function getCombinationToString($val)
{
    // 保存上一个的值
    static $res = array();
    if(empty($res))
    {
        $res = $val;
    }else{
        // 临时数组保存结合的结果
        $list = array();
        foreach ($res as $k => $v) {
            foreach ($val as $key => $value) {
               $list[$k.'_'.$key] = $v.'_'.$value;     
            }
        }
        $res = $list;
    }
    return $res;
}

查看结果。

array(12) {
  ["0_0_0"] => string(12) "红色_M_轻"
  ["0_0_1"] => string(12) "红色_M_重"
  ["0_1_0"] => string(12) "红色_L_轻"
  ["0_1_1"] => string(12) "红色_L_重"
  ["0_2_0"] => string(13) "红色_XL_轻"
  ["0_2_1"] => string(13) "红色_XL_重"
  ["1_0_0"] => string(12) "黄色_M_轻"
  ["1_0_1"] => string(12) "黄色_M_重"
  ["1_1_0"] => string(12) "黄色_L_轻"
  ["1_1_1"] => string(12) "黄色_L_重"
  ["1_2_0"] => string(13) "黄色_XL_轻"
  ["1_2_1"] => string(13) "黄色_XL_重"
}

使用的表结构

属性表 A

id  name 
1   颜色
2   尺寸
3   材质

属性值表 B

id  attr_id attr_val
1    1      红色	
2    1      黄色	
3    2      M
4    2      L
...

实现数据以上的组合数据很简单, 先查出A表然后根据A表ID查询B表

为TA充电
共{{data.count}}人
人已赞赏
工作日志随笔

常用 git 命令

2019-2-26 9:54:22

随笔

Supervisor 守护进程的工具安装与使用

2019-5-13 17:39:04

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧