0

0

利用 array_merge 和 ... 操作符在PHP中高效扁平化多维数组

DDD

DDD

发布时间:2025-12-05 11:38:53

|

970人浏览过

|

来源于php中文网

原创

利用 array_merge 和 ... 操作符在PHP中高效扁平化多维数组

本文将介绍如何在php中将一个包含多个子数组的二维数组扁平化为一维数组。通过结合使用php内置函数 `array_merge` 和数组解包操作符 (`...`),可以简洁高效地实现这一目标,将所有嵌套元素合并到一个单一的数组中,尤其适用于处理由分组操作产生的数据结构。

引言:扁平化多维数组的需求

在PHP开发中,尤其是在处理数据库查询结果、API响应或经过数据分组(如Laravel Collection的 groupBy 方法)后,我们经常会遇到一种数据结构:一个包含多个子数组的数组。每个子数组内部又包含一系列关联数组或对象。例如,您可能会得到如下结构:

[
  [
    {"id":1, "number":1, "name":"ACTIVO", "type":1},
    {"id":2, "number":101, "name":"ACTIVO CORRIENTE", "type":1}
  ],
  [
    {"id":7, "number":2, "name":"PASIVO", "type":2}
  ]
]

然而,在许多场景下,我们需要将这些嵌套的子数组“扁平化”成一个单一的一维数组,将所有元素都直接包含在其中,以便于后续的遍历或处理。期望的输出结构如下:

[
  {"id":1, "number":1, "name":"ACTIVO", "type":1},
  {"id":2, "number":101, "name":"ACTIVO CORRIENTE", "type":1},
  {"id":7, "number":2, "name":"PASIVO", "type":2}
]

本文将详细讲解如何利用PHP的 array_merge 函数和数组解包操作符 (...) 优雅地解决这一问题。

核心方法:array_merge 与数组解包操作符 (...)

PHP提供了一个强大的内置函数 array_merge(),用于将一个或多个数组合并。它的基本用法是接受任意数量的数组作为参数,并返回一个包含所有输入数组元素的合并后的新数组。

立即学习PHP免费学习笔记(深入)”;

而PHP 5.6 引入的数组解包操作符(...,也常被称为“splat”操作符)则允许我们将一个数组或 Traversable 对象展开,作为函数的独立参数传递。当这两个特性结合使用时,便能高效地扁平化一维嵌套数组。

其原理是:array_merge() 函数可以接受多个数组作为参数。如果我们有一个包含多个子数组的数组(例如 $nestedArray = [[...], [...]]),通过 ...$nestedArray,我们可以将 $nestedArray 中的每个子数组“解包”出来,作为独立的参数传递给 array_merge()。

例如,如果 $nestedArray 是 [ $array1, $array2 ],那么 array_merge(...$nestedArray) 实际上等同于 array_merge($array1, $array2)。

Viggle AI Video
Viggle AI Video

Powerful AI-powered animation tool and image-to-video AI generator.

下载

示例代码

以下是一个完整的PHP示例,演示如何将上述嵌套数组扁平化:

运行上述代码,您将得到以下输出:

原始嵌套数组:
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [number] => 1
                    [name] => ACTIVO
                    [type] => 1
                )

            [1] => Array
                (
                    [id] => 2
                    [number] => 101
                    [name] => ACTIVO CORRIENTE
                    [type] => 1
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [id] => 7
                    [number] => 2
                    [name] => PASIVO
                    [type] => 2
                )

        )

)

扁平化后的一维数组:
Array
(
    [0] => Array
        (
            [id] => 1
            [number] => 1
            [name] => ACTIVO
            [type] => 1
        )

    [1] => Array
        (
            [id] => 2
            [number] => 101
            [name] => ACTIVO CORRIENTE
            [type] => 1
        )

    [2] => Array
        (
            [id] => 7
            [number] => 2
            [name] => PASIVO
            [type] => 2
        )

)

可以看到,原始的二维数组被成功扁平化成了一个包含所有元素的单一数组。

工作原理深入解析

当您执行 $flattenedArray = array_merge(...$nestedArray); 时:

  1. $nestedArray 被视为一个包含多个数组的集合。
  2. ... 操作符将 $nestedArray 中的每个直接子元素(即每个内部数组)提取出来。
  3. 这些被提取的子数组随后作为独立的参数被传递给 array_merge() 函数。
  4. array_merge() 接收这些独立的数组参数,并将它们按照顺序合并成一个新的数组。如果存在相同的字符串键,后一个数组的值会覆盖前一个数组的值;对于数字键,则会简单地追加。由于我们的内部数组是索引数组(包含关联数组),所以它们会被简单地追加。

这种方法不仅代码简洁,而且由于 array_merge() 是用C语言实现的PHP内置函数,其执行效率通常比手动编写循环来合并数组要高。

注意事项与最佳实践

  • 适用场景:此方法最适用于将一层嵌套的数组(即数组的数组)扁平化。如果您的数组是多层嵌套(例如 [[[...], ...], ...]),此方法只会扁平化最外层,内部的嵌套结构仍然会保留。对于更深层次的扁平化,您可能需要使用递归函数或者其他专门的库函数(如Laravel Collection的 flatten() 方法)。
  • 键的处理:array_merge() 在合并数组时,对于数字键会重新索引(从0开始),而对于字符串键,如果多个数组中有相同的字符串键,则后面的值会覆盖前面的值。在本文的示例中,内部元素是关联数组,它们作为整体被追加,因此数字键的重新索引是预期的行为。
  • Laravel Collection:如果您在使用Laravel框架,并且处理的是 Illuminate\Support\Collection 实例,那么Collection提供了一个更方便的 flatten() 方法。对于一层嵌套,$collection->flatten(1) 即可实现同样的效果。对于多层嵌套,$collection->flatten()(不带参数或参数为 INF)可以完全扁平化。尽管如此,了解纯PHP的 array_merge 方案对于理解底层机制和在非Laravel环境中使用仍然非常有价值。

总结

通过巧妙地结合使用PHP的 array_merge() 函数和数组解包操作符 (...),我们可以非常简洁且高效地将一层嵌套的二维数组扁平化为一维数组。这种方法不仅代码可读性高,而且利用了PHP的底层优化,是处理此类数据转换的推荐实践。在需要将分组数据或类似结构合并到单个列表中时,掌握这一技巧将大大提高开发效率。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2546

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1612

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1503

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1417

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1446

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

6

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 7.1万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号