头图

在电商平台中,商品往往拥有多个属性(如颜色、尺寸、材质等),每个属性下又有多个选项。我们如何快速生成商品的所有属性组合呢?答案就是通过计算属性的笛卡尔乘积。

今天,我将以一种轻松愉快、易于理解的方式,带领大家实现一个笛卡尔乘积的 PHP 程序。

什么是笛卡尔乘积?

简单来说,笛卡尔乘积是指从不同集合中各取一个元素作为一个元组,所有可能的元组的集合就构成了这些集合的笛卡尔乘积。如果有点抽象,不妨想象下,在线购物时,选择一件衣服的颜色和尺码的过程,你会发现所有可能的颜色和尺码组合,正是一个笛卡尔乘积的应用实例。

使用 Laravel 集合轻松实现

如果你使用的是 Laravel,那么恭喜你,Laravel 提供的集合操作可以让我们轻松计算笛卡尔乘积:

$colors = collect(['颜色_黑色', '颜色_白色', '颜色_咖啡色']);
$sizes = collect(['尺寸_S', '尺寸_M', '尺寸_L']);
$materials = collect(['材质_羽绒', '材质_鹅绒']);

$result = $colors->crossJoin($sizes, $materials);
print_r($result->all());

手动实现笛卡尔乘积

不过,为了深入理解其背后的原理,我们还是用 PHP 的方式实现一遍。下面是通过递归算法实现笛卡尔乘积的代码。

<?php
/**
 * 递归计算笛卡尔乘积
 */

namespace App\Handlers;

class CarteSianHandler
{
    /**
     * 保存结果
     *
     * @var array
     */
    public $products = [];

    /**
     * 计算笛卡尔乘积的结果
     *
     * @param array $params
     * @param array $temporary
     */
    public function carteSian(array $params, array $temporary = [])
    {
        foreach (array_shift($params) as $param) {
            array_push($temporary, $param);
            // 如果还有其他数组需要遍历,递归处理
            if ($params) {
                $this->carteSian($params, $temporary); 
            } else {
                // 所有数组遍历完毕,保存当前组合
                array_push($this->products, $temporary);
            }
            array_pop($temporary); // 回溯,以便进行下一个元素的组合
        }
    }
}

如何使用

接下来,就让我们使用这段代码来生成商品的所有属性组合:

require_once 'CarteSianHandler.php';

$params = [
    ['颜色_黑色', '颜色_白色', '颜色_咖啡色'],
    ['尺寸_S', '尺寸_M', '尺寸_L'],
    ['材质_羽绒', '材质_鹅绒']
];

$cartSian = new App\Handlers\CarteSianHandler();
$cartSian->carteSian($params);

print_r($cartSian->products);

返回结果

执行上述代码,将得到以下结果:

array:18 [
  0 => array:3 [
    0 => "颜色_黑色"
    1 => "尺寸_S"
    2 => "材质_羽绒"
  ]
  ...
  17 => array:3 [
    0 => "颜色_咖啡色"
    1 => "尺寸_L"
    2 => "材质_鹅绒"
  ]
]

以上就是利用 PHP 实现笛卡尔乘积的过程。通过这种方式,我们可以轻松生成商品的所有可能属性组合,这在处理电商平台的商品属性时非常实用。

希望这篇指南能够帮助你更好地理解和应用笛卡尔乘积,增强你的编程工具箱。


左诗右码
85 声望11 粉丝

三观比五官更正,思想比套路更深。常用技术栈PHP、Go、Python,享受编程,平时爱好写点文章。V公主号:「左诗右码」,欢迎关注交流。