创建包含所有可能变体的产品数组

2024-03-27

我正在尝试生成一个包含产品所有变体的数组。可以有无限数量的属性和变化。

提供的数组:

["Shirt"]           # Product
    ["Color"]       # Attribute
        ["Green"]   # Variation
        ["Red"]
        ["Blue"]
    ["Size"]
        ["Small"]
        ["Medium"]
        ["Large"]

预期结果:

[0]
    ["type" => "Shirt"]
    ["color" => "Green"]
    ["Size" => "Small"]
[1]
    ["type" => "Shirt"]
    ["color" => "Green"]
    ["Size" => "Medium"]
...
[4]
    ["type" => "Shirt"]
    ["color" => "Red"]
    ["Size" => "Medium"]
[4]
    ["type" => "Shirt"]
    ["color" => "Red"]
    ["Size" => "Large"]

我尝试过 Laravel 和 PHP 的内置函数,但没有成功。我真的很感激任何见解。


你的问题似乎与我的通用方法很接近:

$arr = [
    'size'  => ['XS', 'S', 'M'],
    'color' => ['yellow', 'brown', 'white'],
    'weight'=> [
        'light' => [
            'super',
            'medium'
        ],
        'normal',
        'heavy' => [
            'regular',
            'most', 
            'overload'
        ]
    ]
];

function variations($array) {
    if (empty($array)) {
        return [];
    }

    function traverse($array, $parent_ind) {
        $r = [];
        $pr = '';

        if(!is_numeric($parent_ind)) {
            $pr = $parent_ind.'-';
        }

        foreach ($array as $ind => $el) {
            if (is_array($el)) {
                $r = array_merge($r, traverse($el, $pr.(is_numeric($ind) ? '' : $ind)));
            } elseif (is_numeric($ind)) {
                $r[] = $pr.$el;
            } else {
                $r[] = $pr.$ind.'-'.$el;
            }
        }

        return $r;
    }

    //1. Go through entire array and transform elements that are arrays into elements, collect keys
    $keys = [];
    $size = 1;

    foreach ($array as $key => $elems) {
        if (is_array($elems)) {
            $rr = [];

            foreach ($elems as $ind => $elem) {
                if (is_array($elem)) {
                    $rr = array_merge($rr, traverse($elem, $ind));
                } else {
                    $rr[] = $elem;
                }
            }

            $array[$key] = $rr;
            $size *= count($rr);
        }

        $keys[] = $key;
    }

    //2. Go through all new elems and make variations
    $rez = [];
    for ($i = 0; $i < $size; $i++) {
        $rez[$i] = [];

        foreach ($array as $key => $value) {
            $current = current($array[$key]);
            $rez[$i][$key] = $current;
        }

        foreach ($keys as $key) {
            if (!next($array[$key])) {
                reset($array[$key]);
            } else {
                break;
            }
        }
    }

    return $rez;
}

die(print_r(variations($arr)));

Result将是所有可能组合的数组attributes或其他什么(见下文)。我用它来创建Test Woocommerce Variable产品。

Testing started at 11:37 ...
/usr/bin/php /usr/local/bin/phpunit --bootstrap /opt/lampp/htdocs/unittests.lo/wp-content/plugins/test-woocommerce-izettle/tests/bootstrap.php --configuration /opt/lampp/htdocs/unittests.lo/wp-content/plugins/test-woocommerce-izettle/phpunit.xml.dist --teamcity
Array
(
    [0] => Array
        (
            [size] => XS
            [color] => yellow
            [weight] => light-super
        )

    [1] => Array
        (
            [size] => S
            [color] => yellow
            [weight] => light-super
        )

    [2] => Array
        (
            [size] => M
            [color] => yellow
            [weight] => light-super
        )

    [3] => Array
        (
            [size] => XS
            [color] => brown
            [weight] => light-super
        )

    [4] => Array
        (
            [size] => S
            [color] => brown
            [weight] => light-super
        )

    [5] => Array
        (
            [size] => M
            [color] => brown
            [weight] => light-super
        )

    [6] => Array
        (
            [size] => XS
            [color] => white
            [weight] => light-super
        )

    [7] => Array
        (
            [size] => S
            [color] => white
            [weight] => light-super
        )

    [8] => Array
        (
            [size] => M
            [color] => white
            [weight] => light-super
        )

    [9] => Array
        (
            [size] => XS
            [color] => yellow
            [weight] => light-medium
        )

    [10] => Array
        (
            [size] => S
            [color] => yellow
            [weight] => light-medium
        )

    [11] => Array
        (
            [size] => M
            [color] => yellow
            [weight] => light-medium
        )

    [12] => Array
        (
            [size] => XS
            [color] => brown
            [weight] => light-medium
        )

    [13] => Array
        (
            [size] => S
            [color] => brown
            [weight] => light-medium
        )

    [14] => Array
        (
            [size] => M
            [color] => brown
            [weight] => light-medium
        )

    [15] => Array
        (
            [size] => XS
            [color] => white
            [weight] => light-medium
        )

    [16] => Array
        (
            [size] => S
            [color] => white
            [weight] => light-medium
        )

    [17] => Array
        (
            [size] => M
            [color] => white
            [weight] => light-medium
        )

    [18] => Array
        (
            [size] => XS
            [color] => yellow
            [weight] => normal
        )

    [19] => Array
        (
            [size] => S
            [color] => yellow
            [weight] => normal
        )

    [20] => Array
        (
            [size] => M
            [color] => yellow
            [weight] => normal
        )

    [21] => Array
        (
            [size] => XS
            [color] => brown
            [weight] => normal
        )

    [22] => Array
        (
            [size] => S
            [color] => brown
            [weight] => normal
        )

    [23] => Array
        (
            [size] => M
            [color] => brown
            [weight] => normal
        )

    [24] => Array
        (
            [size] => XS
            [color] => white
            [weight] => normal
        )

    [25] => Array
        (
            [size] => S
            [color] => white
            [weight] => normal
        )

    [26] => Array
        (
            [size] => M
            [color] => white
            [weight] => normal
        )

    [27] => Array
        (
            [size] => XS
            [color] => yellow
            [weight] => heavy-regular
        )

    [28] => Array
        (
            [size] => S
            [color] => yellow
            [weight] => heavy-regular
        )

    [29] => Array
        (
            [size] => M
            [color] => yellow
            [weight] => heavy-regular
        )

    [30] => Array
        (
            [size] => XS
            [color] => brown
            [weight] => heavy-regular
        )

    [31] => Array
        (
            [size] => S
            [color] => brown
            [weight] => heavy-regular
        )

    [32] => Array
        (
            [size] => M
            [color] => brown
            [weight] => heavy-regular
        )

    [33] => Array
        (
            [size] => XS
            [color] => white
            [weight] => heavy-regular
        )

    [34] => Array
        (
            [size] => S
            [color] => white
            [weight] => heavy-regular
        )

    [35] => Array
        (
            [size] => M
            [color] => white
            [weight] => heavy-regular
        )

    [36] => Array
        (
            [size] => XS
            [color] => yellow
            [weight] => heavy-most
        )

    [37] => Array
        (
            [size] => S
            [color] => yellow
            [weight] => heavy-most
        )

    [38] => Array
        (
            [size] => M
            [color] => yellow
            [weight] => heavy-most
        )

    [39] => Array
        (
            [size] => XS
            [color] => brown
            [weight] => heavy-most
        )

    [40] => Array
        (
            [size] => S
            [color] => brown
            [weight] => heavy-most
        )

    [41] => Array
        (
            [size] => M
            [color] => brown
            [weight] => heavy-most
        )

    [42] => Array
        (
            [size] => XS
            [color] => white
            [weight] => heavy-most
        )

    [43] => Array
        (
            [size] => S
            [color] => white
            [weight] => heavy-most
        )

    [44] => Array
        (
            [size] => M
            [color] => white
            [weight] => heavy-most
        )

    [45] => Array
        (
            [size] => XS
            [color] => yellow
            [weight] => heavy-overload
        )

    [46] => Array
        (
            [size] => S
            [color] => yellow
            [weight] => heavy-overload
        )

    [47] => Array
        (
            [size] => M
            [color] => yellow
            [weight] => heavy-overload
        )

    [48] => Array
        (
            [size] => XS
            [color] => brown
            [weight] => heavy-overload
        )

    [49] => Array
        (
            [size] => S
            [color] => brown
            [weight] => heavy-overload
        )

    [50] => Array
        (
            [size] => M
            [color] => brown
            [weight] => heavy-overload
        )

    [51] => Array
        (
            [size] => XS
            [color] => white
            [weight] => heavy-overload
        )

    [52] => Array
        (
            [size] => S
            [color] => white
            [weight] => heavy-overload
        )

    [53] => Array
        (
            [size] => M
            [color] => white
            [weight] => heavy-overload
        )

)

Process finished with exit code 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建包含所有可能变体的产品数组 的相关文章

  • Google Analytics PHP(发送信息)

    大意 我正在开发一个项目 我需要使用 Google Analytics 服务器端 我不需要检索信息 但我需要发送信息 我最终可以发送 js 脚本客户端 但在这种情况下它不是一个选项 以下大多数链接都非常旧 2012年 检索 不是我需要的 我
  • 通过 AJAX jquery 更改表格背景颜色?

    设想 当我的网页加载时 自动搜索单元格已由用户输入并且具有价值 如果已输入 表格背景颜色将为红色 否则为绿色 假设该表尚未输入 桌子背景绿色是这样的 和表的源代码 table width 1023 height 200 border 1 t
  • PHP 数组键字符串不带引号

    我正在将文件移动到服务器 并使用 GET mode 等变量 而 mode 中不带 单引号 它在本地运行良好 但在服务器上我收到通知 我该如何克服这个问题 这是我的 phpinfo 文件phpinfo http solutiq com php
  • 如何使用图像生成 SVG 二维码?

    我有一个用于生成 jpeg 和 png 格式的 qrcode 的代码 但也想在 PHP 中生成带有背景图像的 svg qrcode 我正在使用 qrlib php 生成 jpeg 和 png 格式 QRlib php 也支持 SVG 不是吗
  • MySQL:更新所有行将字段设置为0,但将一行的字段设置为1

    是否有一种有效的方法将行字段的选择更新为 0 但根据 ID 将其中一行设置为 1 基本上 我在数据库中有多个对象 我想在其中一个 inuse 之间切换 因此查询将其中一行 按 id 设置为 inuse 1 将其他行设置为 inuse 0 谢
  • 如何在 Yii 中设置 returnUrl 值

    我正在使用 Yii 我遇到的问题是Yii app gt user gt returnUrl 它总是让我回到index php page 由于我不知道用户从哪个页面访问了当前页面 如何将其值设置为请求当前页面的页面 您可以使用Yii app
  • 在 while 循环之外使用变量(作用域)

    关于 PHP 范围的小问题 我似乎无法在 while 循环之外调用变量 report 我尝试过各种事情 包括return 这不起作用 这里唯一起作用的两个函数是如果我echo变量 report在循环内 或者如果我print它 我不想这样做
  • 某些表格后的分页符

    我的问题是 我有一个页面 其中包含几个要打印的 html 表格 有些表有很多行 有些则没有 我想要做的是将第一个和第二个表 大表 打印在单独的页面中 其余表 小表 每页打印两个 如何在我想要的位置放置分页符 我试过 但这会在每个表格后面添加
  • 数组和关联数组合并

    如何实现第三个数组 合并Array1和Array2 在 PHP 中做到这一点的最佳方法是什么 非常感谢 Array2 具有类似索引 键 即 Array1 中 id 的关联值 Array1 Array 0 gt Array id gt 56
  • Facebook PHP API 登录时抛出异常

    我尝试使用 Facebook Graph API 登录并获取用户信息 我用来获取用户信息的代码以前可以工作 但今天我尝试使用 Facebook 登录 但 Facebook API 抛出此错误 未定义的偏移量 1 home vendor fa
  • 从本地 html/javascript 网站插入 mySQL 数据库

    我正在尝试做什么 我的程序的目的是插入数据local HTML JS网站变成online 非本地 mySQL数据库 到目前为止我尝试过的 我试图用来实现此目的的原始方法是让我的本地网站使用 javascript 通过在线发布数据PHP文件
  • 一个表单包含两个提交按钮,每个按钮都有不同的操作

    我花了几个小时试图找到问题的解决方案 但似乎找不到正确的解决方案 提前感谢你的帮助 我有一个 html 表单
  • PHP 中的多行字符串文字

    考虑 xml l xml vv echo xml 这将回响vv 为什么以及如何为诸如此类的事情执行多行字符串文字简单XML https en wikipedia org wiki SimpleXML etc Well xml l vv Wo
  • Symfony 5.4 Security Bundle,注册后无法登录

    我在 5 4 版本上构建空的新项目 我使用这些命令来构建项目 composer create project symfony skeleton 5 4 testapp54 cd testapp54 composer require weba
  • 从字符串中删除第一个和最后一个字符

    我有这个 dataList one two three list explode dataList echo pre print r list echo pre 其输出 gt Array gt 0 gt gt 1 gt one gt 2 g
  • 正则表达式:如何表达没有下划线的 \w

    有没有简洁的表达方式 w but without 即 w 中包含的所有字符 除了 我问这个是因为我正在寻找最简洁的方式来表达域名验证 域名可以包含小写和大写字母 数字 句号和破折号 但不能包含下划线 w 包括以上所有内容 加上下划线 那么
  • 向 yahoo 和 hotmail 用户发送电子邮件?

    我正在使用 php 和 mysql 每次用户在我的网站上注册时 我都会使用 php mail 发送一封电子邮件进行身份验证 最近我发现 很多Yahoo和Hotmail用户还没有激活他们的帐户 假设 1000 个用户中 只有 200 个被激活
  • 如何将事件插入为 - Out Office

    我目前正在使用 Google Calendar API 并尝试在我的谷歌日历中插入新的 外出 事件 我使用以下代码插入事件 client getClient service new Google Service Calendar clien
  • Laravel中with()和compact()有什么区别

    功能有什么区别with and compact 在 Laravel 中这两个例子 示例1 return View make books index gt with booksList booksList 示例2 return View ma
  • 测验程序的 MySql 数据库设计

    我目前正在开发一个项目 主要是创建一个测验应用程序 它将能够进行包含 10 到 20 个问题的多项选择题或简答题的测验 它需要能够根据正确答案检查用户的答案 然后对用户的答案进行评分 稍后 我可能会实现一个后端功能来在线创建测验 但现在我将

随机推荐

  • 使用 jQuery 编写 OO Javascript

    我来自 Prototype JS 背景 通过使用 OO Javascript 被鼓励Class create 现在我正在做一些 JQuery 工作 并且尝试编写一些结构正确的 JQuery 代码 例如 我可以从两个不同的单击事件处理程序调用
  • MySQL SUM 函数

    我了解 SQL sum 函数 这是我的代码
  • 无法对文档执行 querySelectorAll。怎么修?

    我在做什么 我有从 PHP 数组生成的链接 该数组生成它自己的唯一 ID 该 ID 应该指向它自己的模态 弹出窗口 div 该 div 具有与链接 ID 匹配的 ID 模态框也是使用 PHP 数组自动生成的 我收到这个错误 我对此非常陌生
  • REPLACE INTO 查询是好的做法吗?

    我需要一个 SQL 查询来更新或创建数据库条目 如果某个客户尚不存在 我在网上找到了目前的解决方案 command CommandText REPLACE INTO Resource Tracer dbo Customer Customer
  • 如何登录 OpenEdge Progress?

    我找到了在 Progress 4GL 中记录某些内容的不同方法 但没有一个令人满意 简单的MESSAGE语句的缺点是它对帧的处理非常糟糕 ON CHOOSE OF btn Q4 DO MESSAGE Line 1 MESSAGE Line
  • struts2 中的 JQuery Grid - 初学者

    我对 struts2 和 JQuery 编程很陌生 在我的应用程序中 当调用 loginAction 时 如果用户是管理员 我会将他们定向到 AdminLoadAction 此操作加载 adminHome jsp 我需要的是 adminHo
  • 有没有办法将--compressed传递到PHP的curl_setopt()中?

    使用curl时 我发现我所访问的服务器上的行为有所不同 具体取决于我是否通过 compressed作为一个论点或不 我已经将 Accept Encoding 标头设置为 gzip deflate sdch curl setopt ch CU
  • 使用 NSPredicate 搜索 NSFetchedResultsController

    我已经被这个问题困扰了一段时间 并已尽力找出解决方案 我正在使用 Core Data 而且对于 iOS 编码来说相对较新 我在如何搜索 fetchedResultsController 以过滤掉用户在 searchBar 中输入的字符串时遇
  • kubernetes 中的 PreStop 钩子永远不会被执行

    我正在尝试创建一个小 Pod 示例 其中包含两个通过 emptyDir 卷共享数据的容器 在第一个容器中 我等待了几秒钟 然后它就被销毁了 在 postStart 中 我正在将一个名为 started 的文件写入共享卷 在 preStop
  • 即使有请求,为什么 gcc 也不抱怨数组边界?

    我正在使用 gcc 4 9 0 我希望看到编译器警告我超出数组范围 如果我编译这个 int main int table 5 0 table 8 1234 int x table 10 使用 g O2 Wall main cpp o mai
  • 如何使用 jQuery 将行追加到表中?

    您好 我尝试使用 jQuery 在表中添加一行 但它不起作用 可能是什么原因 而且 我可以为新添加的行添加一些值吗 这是代码
  • 地理数据网络服务

    我正在考虑编写一个程序来检查英国议会议员最近提出的一些里程声明 实际上大约有 45 000 个里程 我所掌握的数据相当准确 旅行的出发地和目的地通常仅 在城镇级别提供 我想做的基本上是查看他们提交的里程数据 查看从网络服务获得的 计算 里程
  • 当 Node.js 内部仍然依赖于线程时,它如何本质上更快?

    我刚刚观看了以下视频 Node js 简介 http www yuiblog com blog 2010 05 20 video dahl 并且仍然不明白如何获得速度优势 主要是 Ryan Dahl Node js 的创建者 曾经说过 No
  • Android Ion 缓存刷新

    我使用特定的网址在线获取图像 但网址本身每隔几分钟就会自动更改 我正在使用 ION 库Here https github com koush ion我遇到的问题是 当我刷新页面时 页面本身看起来正在刷新 但出现了完全相同的图片 我假设它是缓
  • 使用 Silverlight 的本地数据库

    对于 Silverlight 应用程序来说 什么是好的本地数据库 数据库的主要用途是提供本地数据缓存和同步服务 我不相信 SQL Anywhere 或 SQLite 会工作 因为它们使用非托管代码 无法在 silverlight 沙箱下运行
  • 如何对 Android 应用程序进行定时炸弹?

    大家好 有没有人有一个代码示例 说明如何对 Android 应用程序进行定时炸弹 使其在给定日期后无法运行 我想发布一个 测试版 应用程序进行测试 但希望确保它仅在该应用程序正式处于测试版时才能工作 我建议使用 Calendar 类并让您的
  • Android:从软键盘中删除 Enter 键

    在我的登录表单中 当用户单击 EditText 并按 Enter 键时 会插入一个新行 从而增加 EditText 的大小 下一刻 它返回到之前的位置 并在密码字段 这是下一个字段 中打印一个点 我想从软键盘上删除这个回车键 是否可以 Us
  • Android java.lang.ClassCastException:android.widget.LinearLayout 无法转换为 android.widget.TextView

    我试图打印在 listView 中单击的值 但随后出现以下异常 07 04 10 40 56 482 E AndroidRuntime 1356 FATAL EXCEPTION main 07 04 10 40 56 482 E Andro
  • Reactjs 状态未更新

    constructor props super props this state active false showSideBar false className componentDidMount if this props overla
  • 创建包含所有可能变体的产品数组

    我正在尝试生成一个包含产品所有变体的数组 可以有无限数量的属性和变化 提供的数组 Shirt Product Color Attribute Green Variation Red Blue Size Small Medium Large