求商品SKU的所有组合(笛卡尔积)-js和php实现版

简介: 求商品SKU的所有组合(笛卡尔积)-js和php实现版

JavaScript代码实现

/**
 * 组合多个数组
 * @param  {...Array} arrays 
 * @returns 
 */
function combine(...arrays) {
  let list = [];
  let helper = function (index, prev) {
    // 当前数组
    let array = arrays[index];
    // 是否为最后一个数组
    let is_last = arrays.length - 1 == index;
    for (let item of array) {
      let current = prev.concat(item);
      if (is_last) {
        list.push(current);
      } else {
        helper(index + 1, current);
      }
    }
  };
  helper(0, []);
  return list;
}
let names = ['iPhone X', 'iPhone XS'];
let colors = ['黑色', '白色'];
let storages = ['64g', '256g'];
console.log(combine(names, colors, storages));

输出


[
  [ 'iPhone X', '黑色', '64g' ],
  [ 'iPhone X', '黑色', '256g' ],
  [ 'iPhone X', '白色', '64g' ],
  [ 'iPhone X', '白色', '256g' ],
  [ 'iPhone XS', '黑色', '64g' ],
  [ 'iPhone XS', '黑色', '256g' ],
  [ 'iPhone XS', '白色', '64g' ],
  [ 'iPhone XS', '白色', '256g' ]
]

PHP实现版

<?php
function helper($index, $prev, $arrays, & $list)
{
    // 当前数组
    $array = $arrays[$index];
    // 是否为最后一个数组
    $is_last = count($arrays) - 1 == $index;
    foreach ($array as $item) {
        $current = $prev;
        $current[] = $item;
        if ($is_last) {
            $list[] = $current;
        } else {
            helper($index + 1, $current, $arrays, $list);
        }
    }
}
function combine(...$arrays)
{
    $list = [];
    helper(0, [], $arrays, $list);
    return $list;
}
$names = ['iPhone X', 'iPhone XS'];
$colors = ['黑色', '白色'];
$storages = ['64g', '256g'];
echo json_encode(combine($names, $colors, $storages), JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);

输出结果


[
    ["iPhone X", "黑色", "64g"],
    ["iPhone X", "黑色", "256g"],
    ["iPhone X", "白色", "64g"],
    ["iPhone X", "白色", "256g"],
    [ "iPhone XS", "黑色", "64g"],
    [ "iPhone XS", "黑色", "256g"],
    [ "iPhone XS", "白色", "64g"],
    [ "iPhone XS", "白色", "256g"]
]
相关文章
|
2月前
|
JavaScript Java PHP
快速对比:Django、Spring Boot、Node.js 和 PHP
快速对比:Django、Spring Boot、Node.js 和 PHP
81 7
|
2月前
|
JavaScript
js学习--商品列表商品详情
js学习--商品列表商品详情
20 2
|
4月前
|
JavaScript 前端开发 网络安全
Node.js和php
【8月更文挑战第4天】Node.js和php
46 3
|
4月前
|
JavaScript PHP 开发者
PHP中的异常处理与自定义错误处理器构建高效Web应用:Node.js与Express框架实战指南
【8月更文挑战第27天】在PHP编程世界中,异常处理和错误管理是代码健壮性的关键。本文将深入探讨PHP的异常处理机制,并指导你如何创建自定义错误处理器,以便优雅地管理运行时错误。我们将一起学习如何使用try-catch块捕获异常,以及如何通过set_error_handler函数定制错误响应。准备好让你的代码变得更加可靠,同时提供更友好的错误信息给最终用户。
|
6月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的商品推荐系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的商品推荐系统附带文章源码部署视频讲解等
45 0
基于springboot+vue.js+uniapp小程序的商品推荐系统附带文章源码部署视频讲解等
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的二手商品网站附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的二手商品网站附带文章源码部署视频讲解等
22 0
|
6月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的超市库存商品管理系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的超市库存商品管理系统附带文章和源代码部署视频讲解等
51 4
|
5月前
|
算法 PHP
轻松实现商品多属性组合:深入理解笛卡尔乘积的 PHP 实现方法
在电商场景中,生成商品属性组合的关键是计算笛卡尔乘积。本文以通俗易懂的方式展示了如何用PHP实现这一功能。使用Laravel时,可直接通过`collect`对象的`crossJoin`方法轻松获取;手动实现则涉及递归算法,通过`CarteSianHandler`类完成。最终结果为一个包含所有属性组合的数组,适用于处理商品的多种属性选项。
49 0
|
7月前
|
JavaScript Java 测试技术
基于ssm+vue.js的会员制度管理的商品营销系统附带文章和源代码设计说明文档ppt
基于ssm+vue.js的会员制度管理的商品营销系统附带文章和源代码设计说明文档ppt
44 1
|
6月前
|
JavaScript 前端开发
杨老师课堂之JavaScript定时器限时抢购秒杀商品案例
杨老师课堂之JavaScript定时器限时抢购秒杀商品案例
63 0