如何从多个数组中获取所有组合?

2024-01-08

假设我有这 3 个数组

$array1 = array(1,2);
$array2 = array(4,5);
$array3 = array(7,8);

我需要这个输出

1 4 7
1 4 8
1 5 7
1 5 8
2 4 7
2 4 8
2 5 7
2 5 8

我的问题之一是我的数组可能有 3 到 15 个不同的数组,每个数组可能为空(我可能会添加 0 只是为了不为空)或有很多值。 如果我有一个空数组,我还需要将其算作有效列。这些值将用于按特定顺序填充数据库。

我有什么办法可以做到这一点吗?


有多少种组合?

那么首先的问题是有多少种组合?答案是你必须将每个数组的数量相乘。

So (c = amount1):

carray 1 * carray 2 * ... * carray n

具体针对您的示例:

carray 1 * carray 2 * carray 3 = 2 * 2 * 2 = 8

*1 And if you wonder why I chose c for amount, because of the function count() in php

将所有组合组合在一起

我们现在如何获得与我们拥有的数组数量的所有组合?

我们循环遍历我们已经拥有的所有组合(从一个组合开始,一个“空组合”($combinations = [[]];)),对于每个组合,我们都会遍历下一个数据数组,并将每个组合与每个输入数据组合成一个新的组合。

现在我们这样做,直到获得每个组合所需的长度。

举个例子:

Array with the elements (Empty array is '[]'):

[
    [1, 2],
    [3, 4]
]
                               //↓ new combinations for the next iteration
                               │
array NAN*:

    Combinations:
                  - []         │  -> []
                                  │
array 1 [1,2]:      ┌─────────────┤
                    │             │
    Combinations:   v             v
                  - []    + 1  │  -> [1]  
                  - []    + 2  │  -> [2]   
                                  │
array 2 [3,4]:      ┌─────────────┤
                    │             │
    Combinations:   v             v
                  - []    + 3  │  -> [3]
                  - []    + 4  │  -> [4]
                  - [1]   + 3  │  -> [1,3]  //desired length 2 as we have 2 arrays 
                  - [1]   + 4  │  -> [1,4]  //desired length 2 as we have 2 arrays 
                  - [2]   + 3  │  -> [2,3]  //desired length 2 as we have 2 arrays 
                  - [2]   + 4  │  -> [2,4]  //desired length 2 as we have 2 arrays    
                               //↑ All combinations here

* NAN: not a number

正如您在上面的示例中看到的,我们现在拥有所有组合,其长度等于我们拥有的所有数组的数量。

但为了仅获得具有所需长度的组合,我们每次迭代都会覆盖结果数组,以便最终只有具有预期长度的组合位于结果数组中。

Code:

<?php

    $array1 = array(1,2);
    $array2 = array(4,5);
    $array3 = array(7,8);


    $combinations = [[]];
    $data = [
        $array1,
        $array2,
        $array3,
    ];
    $length = count($data);

    for ($count = 0; $count < $length; $count++) {
        $tmp = [];
        foreach ($combinations as $v1) {
            foreach ($data[$count] as $v2)
                $tmp[] = array_merge($v1, [$v2]);

        }
        $combinations = $tmp;
    }

    print_r($combinations);

?>

output:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 4
            [2] => 7
        )
    //...
    [7] => Array
        (
            [0] => 2
            [1] => 5
            [2] => 8
        )

)

对于关联数组,您只需要做一些轻微的修改,即:

  1. 首先将数组键分配给变量array_keys(), e.g.

    $keys = array_keys($data);
    
  2. 使用第二个 foreach 循环中的键来访问数据数组,意味着来自:

    foreach ($data[$count] as $v2)
    

    to:

    
    foreach ($data[$keys[$count]] as $v2)  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从多个数组中获取所有组合? 的相关文章

  • 如何在原生 Swift 中实现以前称为 NSMutableOrderedSet 的可变有序集泛型类型?

    我正在尝试实现一个通用的可变有序集类型 它需要符合许多协议才能以与 Swift 中的数组和集合相同的方式运行 首先要实现泛型类型元素需要符合Hashable https developer apple com documentation s
  • RestSharp反序列化JSON内容(代表一个对象包含字节数组)错误

    Client端收到正式的JSON内容 Id 1 2 3 Size 56 但在反序列化字节数组时出现错误 1 下面的语句出现错误 IRestResponse
  • mongodb对话系统

    我正在实施一个verymongodb 上的简单对话系统 这个想法应该是 当我打开一个 convo 时 它应该显示发送和接收的消息 到目前为止一切正常 并且应该非常容易 通过使用像这样的伪代码这样的简单查询 from my id AND to
  • 如何在 Laravel 5.5 中编辑“页面因不活动而已过期”的视图

    在 Laravel 5 5 中 当您使用 CSRF 保护 默认情况下 并且在长时间不活动后发送发布请求时 您将收到此错误页面 屏幕截图 我对此错误表示同意 但是 我需要更改此错误的视图 文本以确保与我的应用程序风格和语言相匹配 关于如何编辑
  • 如何将具有对象数据类型的 Numpy 2D 数组转换为常规的浮点数 2D 数组

    作为我正在开发的更广泛程序的一部分 我最终得到了包含字符串 3D 坐标等的对象数组 所有这些都混合在一起 我知道与结构化数组相比 对象数组可能不是很受欢迎 但我希望在不更改大量代码的情况下解决这个问题 假设我的数组 obj array 有
  • 将对象字面量转换为排序数组

    我有一个对象文字 其中它的键的值是多个对象 并且内部对象的键之一被命名为 rank 并且具有浮点值 我想将对象文字转换为内部对象的数组 按 rank 的值排序 输入对象 452 bla 123 dff 233 rank 2 234 bla
  • 在 C 中创建 int 数组的数组?

    假设我有以下方法原型 void mix audio int vocal data array int instrumental data array int mixed audio array FOURTH ARGUMENT 我会怎样 在上
  • 如何将 ctype_alpha 与 UTF-8 结合使用

    如何将 ctype alpha 与 UTF 8 一起使用 我有这个代码 if empty POST false if isset POST first name empty POST first name if ctype alpha PO
  • 适用于 Windows 的 PHP 支持的 GUI 应用程序

    我知道 PHP 是一种解释性语言 对于基于 Web 的事物来说 不是为在实际操作系统上运行 GUI 应用程序而设计的 但是有没有办法呢 基本上 是否有一个框架 系统允许我创建 本机 基本上是二进制文件 exe 看起来像带有本机控件和所有内容
  • 如何在javascript中使用自动递增id?

  • SimpleSAMLPHP 重定向循环

    我们正在尝试使用自定义 mysql 数据库设置 sso 但它在以下两个请求之间进入无限循环 POST http 192 168 0 15 simplesaml module php core loginuserpass php 设置Cook
  • Propel Query 中的动态表名称

    我想知道您是否可以使 propel 查询的表名称动态化 有点像变量 一个例子类似于 DynamicVar Query create 我让它在 ifs 中工作 就像下面的例子一样 但如果更动态地制作 可以删除相当多的行 这些表的设置都是相同的
  • 登录后所有页面都应该是https吗?

    这有点难以解释 但我会尽力 有一个网站 每个页面上都有登录表单 其中包含用户名 密码字段 这些页面未使用 SSL 用户填写用户名 密码并提交表单后 表单将被发送到 https 的身份验证页面 对于这种情况我有几个疑问 向 https 页面提
  • URL 重写帮助

    RewriteEngine on RewriteCond REQUEST URI index php RewriteRule index php q 1 L 这应该将任何 url 重写为 index php q url 并且它可以工作 反正
  • 如何覆盖 phpunit 中导出的变量?

    我知道我可以设置环境变量 https phpunit de manual current en appendixes configuration html在我的 phpunit xml 里面
  • Perl 中令人困惑的文件句柄

    一直在使用以下脚本 但仍然无法理解两种不同 类型 的文件句柄形式背后的含义 任何见解将不胜感激 usr bin perl use warnings use strict open FH example txt or die while
  • php向多个收件人发送邮件

    我可以通过在邮件程序中定义 id 来将电子邮件发送到一个电子邮件 id 但是当用户在表单中键入 消息和电子邮件 id 时 我无法理解如何发送到多个收件人 例如 我正在显示一个带有两个文本区域的表单 一个用于电子邮件 ID 一个用于自定义消息
  • NodeJS 和 PHP (Laravel) 集成用于 Socket.IO 实时聊天

    目前我有一个我写过的网站PHP通过Laravel 框架 我已经使用写了一个实时聊天nodeJS with 套接字IO and Express现在我想做的是将它集成到我已经编写的 Laravel 网站中 问题是聊天必须在主页中 当前由 Lar
  • Laravel 5 注销特定用户

    在我的 laravel 5 应用程序中 有一个功能允许具有管理员角色的用户重置非管理员的任何人的密码 但这不会强制该人注销并再次登录 更改密码后如何强制用户注销 我没有对用于验证用户身份或任何内容的中间件进行任何更改 我不知道它是否有效 但
  • PHP 中的 Zip 流

    我有一个 PHP 脚本 可以动态创建 zip 文件并强制浏览器下载该 zip 文件 问题是 我可以直接将zip文件写入连接到用户浏览器的输出流 而不是先将其保存为服务器上的真实文件 然后发送文件吗 提前致谢 如果您的 Web 服务器运行的是

随机推荐

  • 如何在 R 中捕获错误/异常? [复制]

    这个问题在这里已经有答案了 可能的重复 R 中的异常处理 https stackoverflow com questions 2622777 exception handling in r 有谁知道如何捕获 R 中的错 误或异常吗 就像约书
  • Go 生成的动画 GIF 在 Windows 中不起作用

    我发现一个示例在 Windows 中无法正常工作 该程序演示了 Go 标准图像包的基本用法 我们将使用它来创建位图图像序列 然后将该序列编码为 GIF 动画 package main import image image color ima
  • powershell if-else 不遵循任一分支

    我有powershell代码 target dir server share DelTmpStatus init value if Test Path target dir receivals tmp del target dir rece
  • 简单 Yarn 应用程序的 NoClassDefFoundError

    我试图从运行简单的纱线应用程序简单纱线应用程序 https github com hortonworks simple yarn app 但我在应用程序错误日志中收到以下异常 Exception in thread main java la
  • malloc 和 calloc 分配的内存块布局有何不同?

    calloc http www cplusplus com reference clibrary cstdlib calloc 分配num内存块 每个大小size void calloc size t num size t size 在内存
  • 如何在SQL Server中的历史表中存储历史记录

    我有2张桌子 Table A and Table A History Table A包含当前数据行 Table A History包含历史数据 我想要最新的数据行Table A and Table A History包含历史行 我可以想到两
  • 在 Android 中创建 CDMA (3gpp2) PDU

    我上周问了一个类似的问题 甚至在意识到问题是给出的答案是针对一个GSM PDU 3gpp https stackoverflow com a 12338541 1443717它在模拟器 android 2 2 中完美运行 我接受了答案并授予
  • 无法确定外键的复合外键排序

    Person是包含所有用户的用户模型 变更模型包括EngineerId和ManagerId 两者都是Person ID 为什么我会收到此错误 无法确定类型 ProjectName Models Change 上外键的复合外键排序 在复合外键
  • Tomcat 中的 crossContext 属性有什么作用?它是否启用会话共享?

    我能找到的一切Tomcat 5 5 文档 http tomcat apache org tomcat 5 5 doc config context html is 如果您希望在此应用程序中调用 ServletContext getConte
  • 将 Google 表单发布到 MySQL 数据库?

    我浏览了网络 谷歌等 我无法破译是否可以将谷歌表单数据发布到谷歌文档and到我网站其余部分运行的数据库 这样做的原因是 我可以允许拥有 Google 帐户的人完成大型表格或调查 我可以快速轻松地构建这些表格或调查 感谢您的任何启发性回复 是
  • 如何使 JavaFX MediaView 拉伸媒体以填充父容器?

    我试图使视频的尺寸自动拉伸并填充 MediaView 并保持视频的原始宽高比 基本上 我希望我的 MediaPlayer 在调整大小等时适合父容器 就像几乎所有视频播放器一样 如果有人能够阐明如何实现这一目标 我们将不胜感激 谢谢 下面是拉
  • 如何在不启动应用程序的情况下检查 AppleScript 是否正在运行 - 通过 osascript 实用程序

    考虑以下 AppleScript on is running appName tell application System Events to name of processes contains appName end is runni
  • 安全的跨平台协程

    我遇到的所有协程实现都使用汇编或检查的内容jmp buf 问题在于它本质上不跨平台 我认为以下实现不会导致未定义的行为或依赖于实现细节 但我从来没有遇到过这样写的协程 在线程中使用长跳转是否存在一些固有的缺陷 这段代码中是否存在一些隐藏的问
  • jQuery focus() 有时在 IE8 中不起作用

    我正在使用 jQuery 开发 web 应用程序 我有添加新行 3 个输入字段的功能 创建这些 DOM 元素后 我想要聚焦输入字段之一 我正在通过在必要的输入字段上调用 jQuery focus 函数来做到这一点 问题是调用 focus 在
  • Java中如何实现多线程

    我必须对一个以 1000 个批次运行代码的方法进行多线程处理 我需要将这些批次分配给不同的线程 目前我已经生成了 3 个线程 但所有 3 个线程都选择了第一批 1000 个线程 我希望其他批次不应该选择同一批次 而是选择其他批次 请大家帮忙
  • Android Studio 意外锁定文件协议

    我正在尝试将 android studio 项目导入到新机器中 导入进行得很好 并且项目的目录显示正确 但是 当我尝试构建或清理项目时 android studio 会引发以下错误 Gradle ngoma project refresh
  • 在 Chrome 扩展程序中读取和修改 HTTP GET 请求

    我想在 Chrome 扩展程序中读取和修改 添加 HTTP 标头 我正在使用 chrome webRequest API 来实现同样的目的 但我仍然无法阅读它 这是我的代码 chrome webRequest onBeforeSendHea
  • 为什么 QList::at() 不检查索引是否存在并返回只读值?

    这个问题更多的是一种询问 而不是实际寻求问题的解决方案 QList at 不仅不检查索引是否越界 而且还返回const因此它只能用于read only设想 const T QList at int i const 返回列表中索引位置 i 处
  • Android CalendarView 4.1 上的文本尺寸太小

    Jelly Bean 4 1 似乎存在一个错误 导致日期的文本大小CalendarView在高分辨率设备上小得不成比例 似乎它已在 4 2 中修复 但是有没有任何解决方法可以使其在 4 1 设备上看起来合理 我尝试过这样的事情
  • 如何从多个数组中获取所有组合?

    假设我有这 3 个数组 array1 array 1 2 array2 array 4 5 array3 array 7 8 我需要这个输出 1 4 7 1 4 8 1 5 7 1 5 8 2 4 7 2 4 8 2 5 7 2 5 8 我