分享一个递归计算笛卡尔积的方法

话不多说,先贴代码

namespace CarteSian;

class CarteSian
{

    /**
     * Store results
     *
     * @var array
     */
    public $products = [];

    /**
     * Calculate the Cartesian product
     *
     * @param array $params
     * @param array $temporary
     */
    public function carteSian(array $params, array $temporary = [])
    {
        foreach (
            array_shift($params) as $param
        ) {
            array_push($temporary, $param);
            $params ? $this->carteSian(
                $params, $temporary
            ) : array_push(
                $this->products, $temporary
            );
            array_pop($temporary);
        }
    }
}

使用

$cartSian = new CarteSian();

$params = [
   'Girls' => [
       '雾岛董香',
       '艾米莉娅',
       '结城明日奈',
   ],
   'Boys' => [
       '金木研',
       '菜月昴',
       '桐谷和人',
   ],
   'Hentais' => [
       '华城绫女',
       '培提尔其乌斯·罗马尼空提',
       '月山习',
   ]
];

$cartSian->carteSian($params);

print_r($cartSian->products);

输出结果

Array
(
   [0] => Array
       (
           [0] => 雾岛董香
           [1] => 金木研
           [2] => 华城绫女
       )

   [1] => Array
       (
           [0] => 雾岛董香
           [1] => 金木研
           [2] => 培提尔其乌斯·罗马尼空提
       )

   [2] => Array
       (
           [0] => 雾岛董香
           [1] => 金木研
           [2] => 月山习
       )

   [3] => Array
       (
           [0] => 雾岛董香
           [1] => 菜月昴
           [2] => 华城绫女
       )

   [4] => Array
       (
           [0] => 雾岛董香
           [1] => 菜月昴
           [2] => 培提尔其乌斯·罗马尼空提
       )

   [5] => Array
       (
           [0] => 雾岛董香
           [1] => 菜月昴
           [2] => 月山习
       )

   [6] => Array
       (
           [0] => 雾岛董香
           [1] => 桐谷和人
           [2] => 华城绫女
       )

   [7] => Array
       (
           [0] => 雾岛董香
           [1] => 桐谷和人
           [2] => 培提尔其乌斯·罗马尼空提
       )

   [8] => Array
       (
           [0] => 雾岛董香
           [1] => 桐谷和人
           [2] => 月山习
       )

   [9] => Array
       (
           [0] => 艾米莉娅
           [1] => 金木研
           [2] => 华城绫女
       )

   [10] => Array
       (
           [0] => 艾米莉娅
           [1] => 金木研
           [2] => 培提尔其乌斯·罗马尼空提
       )

   [11] => Array
       (
           [0] => 艾米莉娅
           [1] => 金木研
           [2] => 月山习
       )

   [12] => Array
       (
           [0] => 艾米莉娅
           [1] => 菜月昴
           [2] => 华城绫女
       )

   [13] => Array
       (
           [0] => 艾米莉娅
           [1] => 菜月昴
           [2] => 培提尔其乌斯·罗马尼空提
       )

   [14] => Array
       (
           [0] => 艾米莉娅
           [1] => 菜月昴
           [2] => 月山习
       )

   [15] => Array
       (
           [0] => 艾米莉娅
           [1] => 桐谷和人
           [2] => 华城绫女
       )

   [16] => Array
       (
           [0] => 艾米莉娅
           [1] => 桐谷和人
           [2] => 培提尔其乌斯·罗马尼空提
       )

   [17] => Array
       (
           [0] => 艾米莉娅
           [1] => 桐谷和人
           [2] => 月山习
       )

   [18] => Array
       (
           [0] => 结城明日奈
           [1] => 金木研
           [2] => 华城绫女
       )

   [19] => Array
       (
           [0] => 结城明日奈
           [1] => 金木研
           [2] => 培提尔其乌斯·罗马尼空提
       )

   [20] => Array
       (
           [0] => 结城明日奈
           [1] => 金木研
           [2] => 月山习
       )

   [21] => Array
       (
           [0] => 结城明日奈
           [1] => 菜月昴
           [2] => 华城绫女
       )

   [22] => Array
       (
           [0] => 结城明日奈
           [1] => 菜月昴
           [2] => 培提尔其乌斯·罗马尼空提
       )

   [23] => Array
       (
           [0] => 结城明日奈
           [1] => 菜月昴
           [2] => 月山习
       )

   [24] => Array
       (
           [0] => 结城明日奈
           [1] => 桐谷和人
           [2] => 华城绫女
       )

   [25] => Array
       (
           [0] => 结城明日奈
           [1] => 桐谷和人
           [2] => 培提尔其乌斯·罗马尼空提
       )

   [26] => Array
       (
           [0] => 结城明日奈
           [1] => 桐谷和人
           [2] => 月山习
       )

)

Github地址 Seaony/CarteSian

小菜鸟第一次发帖~,欢迎大家提出意见 ^ ^

本帖已被设为精华帖!
本帖由系统于 2年前 自动加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

哈哈哈哈 算法可以的~

其实laravel的collect提供了此类方法crossJoin

另外 看到三个数组素材就知道你是个死(绅)宅(士)233333
握爪

5年前 评论

很好,刚好用得上!!

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!