摘要:所以作为源数组,你可以将数组的值以引用传递方法传入回调函数,数组的键名直接传入就好了数组连接操作在中合并数组的最佳方式是使用函数。为了实现从数组中删除不在其他数组中的值译注计算差值,使用。
本文首发于 PHP 数组使用之道,转载请注明出处。
这个教程我将通过一些实用的实例和最佳实践的方式列举出 PHP 中常用的数组函数。每个 PHP 工程师都应该掌握它们的使用方法,以及如何通过组合使用来编写更精简且易读的代码。
另外,我们提供了相关示例代码的演示文稿,你可以从相关链接下载它,并分享给你的团队来打造更强的团队。
入门先让我们从一些处理数组键名和键值的基础数组函数开始。array_combine() 作为数组函数中的一员,用于通过使用一个数组的值作为其键名,另一个数组的值作为其值来创建一个全新数组:
blue // [grass] => green // [orange] => orange // )
你应该知道,array_values() 函数会以索引数组形式返回数组中的值,array_keys() 则会返回给定数组的键名, 以及 array_flip() 函数,它的功能则是交换数组中的键值和键名:
sky // [green] => grass // [orange] => orange // )简化代码
list() 函数,确切的说它不是一个函数,而是一种语言结构,可以在单次操作中将数组中的值赋值给一组变量。举个例子,下面给出 list() 函数的基本使用:
这个语言结构结合 preg_split() 或 explode() 这类函数使用效果更佳,如果你无需定义其中的某些值,可以直接跳过一些参数的赋值:
$string = "hello|wild|world"; list($hello, , $world) = explode("|", $string); echo $hello, " ", $world;另外,list() 还可用于 foreach 遍历,这种用法更能发挥这个语言结构的优势:
$arrays = [[1, 2], [3, 4], [5, 6]]; foreach ($arrays as list($a, $b)) { $c = $a + $b; echo $c, ", "; }译者注:list() 语言结构仅适用于数字索引数组,并默认索引从 0 开始,且无法用于关联数组,查看 文档。而通过使用 extract() 函数,你可以将关联数组导出到变量(符号表)中。对数组中的各个元素,将会以其键名作为变量名创建,变量的值则为对应元素的值:
"t-shirt", "size" => "medium", "color" => "blue", ]; extract($array); echo $clothes, " ", $size, " ", $color;注意在处理用户数据(如请求的数据)时 extract() 函数是一个安全的函数,所以此时最好使用更好的 标志类型 如 EXTR_IF_EXISTS 和 EXTR_PREFIX_ALL。
extract() 函数的逆操作是 compact() 函数,用于通过变量名创建关联数组:
t-shirt // [size] => medium // [color] => blue // )过滤函数PHP 提供一个用于过滤数组的超赞的函数,它是 array_filter()。将待处理数组作为函数的第一个参数,第二个参数是一个匿名函数。如果你希望数组中的元素通过验证则在匿名函数返回 true,否则返回 false:
0; }); print_r($positive);// [0 => 20, 2 => 50, 4 => 55]函数不仅支持通过值过滤。你还可以使用 ARRAY_FILTER_USE_KEY 或 ARRAY_FILTER_USE_BOTH 作为第三参数指定是否将数组的键值或将键值和键名同时作为回调函数的参数。
你还可以不在 array_filter() 函数中定义回调函数以删除空值:
-1, 2 => 1]你可以使用 array_unique() 函数用于从数组中获取唯一值元素。注意该函数会保留唯一元素在原数组中的键名:
1 // [4] => 2 // [7] => 3 // [8] => 4 // [9] => 5 // )array_column() 函数可以从多维数组(multi-dimensional)中获取指定列的值,如从 SQL 数据库中获取答案或者 CSV 文件导入数据。只需要传入数组和指定的列名:
1, "title" => "tree"], ["id" => 2, "title" => "sun"], ["id" => 3, "title" => "cloud"], ]; $ids = array_column($array, "id"); print_r($ids);// [1, 2, 3]从 PHP 7 开始,array_column 功能更加强大,因为它开始支持 包含对象的数组,所以在处理数组模型时变得更加容易:
all(); $cinema_ids = array_column($cinemas, "id"); // php7 forever!数组遍历处理通过使用 array_map(),你可以对数组中的每个元素执行回调方法。你可以基于给定的数组传入函数名称或匿名函数来获取一个新数组:
对于这个函数还有个谣言,无法同时将数组的键名和键值传入到回调函数,但是我们现在要来打破它:
7, "name" => "James"]; $res = array_map(function ($key, $value) { return $key . " is " . $value; }, array_keys($model), $model); print_r($res); // Array // ( // [0] => id is 7 // [1] => name is James // )不过这样处理起来实在是丑陋。最好使用 array_walk() 函数来替代。这个函数表现上和 array_map() 类似,但是工作原理完全不同。第一,数组是以引用传值方式传入,所以 array_walk() 不会创建新数组,而是直接修改原数组。所以作为源数组,你可以将数组的值以引用传递方法传入回调函数,数组的键名直接传入就好了:
"yellow", "apple" => "green", "orange" => "orange", ]; array_walk($fruits, function (&$value, $key) { $value = $key . " is " . $value; }); print_r($fruits);数组连接操作在 PHP 中合并数组的最佳方式是使用 array_merge() 函数。所有的数组选项会合并到一个数组中,具有相同键名的值会被最后一个值所覆盖:
"a", "b" => "b", "c" => "c"]; $array2 = ["a" => "A", "b" => "B", "D" => "D"]; $merge = array_merge($array1, $array2); print_r($merge); // Array // ( // [a] => A // [b] => B // [c] => c // [D] => D // )译注:有关合并数组操作还有一个「+」号运算符,它和 array_merge() 函数的功能类似都可以完成合并数组运算,但是结果有所不同,可以查看 PHP 合并数组运算符 + 与 array_merge 函数 了解更多细节。为了实现从数组中删除不在其他数组中的值(译注:计算差值),使用 array_diff()。还可以通过 array_intersect() 函数获取所有数组都存在的值(译注:获取交集)。接下来的示例演示它们的使用方法:
1, 1 => 2] print_r($intersect); //交集 [2 => 3, 3 => 4]数组的数学运算使用 array_sum() 对数组元素进行求和运算,array_product 对数组元素执行乘积运算,或者使用 array_reduce() 处理自定义运算规则:
为了实现统计数组中值的出现次数,可以使用 array_count_values() 函数。它将返回一个新数组,新数组键名为待统计数组的值,新数组的值为待统计数组值的出现次数:
2 // [banana] => 1 // [tree] => 3 // )生成数组需要以给定值生成固定长度的数组,可以使用 array_fill() 函数:
根据范围创建数组,如小时或字母,可以使用 range() 函数:
为了实现获取数组中的部分元素 - 比如,获取前三个元素 - 使用 array_slice() 函数:
排序数组首先谨记 PHP 中有关排序的函数都是 引用传值 的,排序成功返回 true 排序失败返回 false。排序的基础函数是 sort() 函数,它执行排序后的结果不会保留原索引顺序。排序函数可以归类为以下几类:
a 保持索引关系进行排序
k 依据键名排序
r 对数组进行逆向排序
u 使用用户自定义排序规则排序
你可以从下表看到这些排序函数:
a | k | r | u | |
---|---|---|---|---|
a | asort | arsort | uasort | |
k | ksort | krsort | ||
r | arsort | krsort | rsort | |
u | uasort | usort |
数组处理的艺术是组合使用这些数组函数。这里我们通过 array_filter() 和 array_map() 函数仅需一行代码就可以完成空字符截取和去空值处理:
依据模型数组创建 id 和 title 数据字典,我们可以结合使用 array_combine() 和 array_column() 函数:
译注:提供一个 可运行的版本。为了实现获取出现频率最高的数组元素,我们可以使用 array_count_values()、arsort() 和 array_slice() 这几个函数:
还可以轻易的通过 array_sum() 和 array_map() 函数仅需数行就能完成计算订单的价格:
1, "price" => 99, "count" => 1], ["product_id" => 2, "price" => 50, "count" => 2], ["product_id" => 2, "price" => 17, "count" => 3], ]; $sum = array_sum(array_map(function ($product_row) { return $product_row["price"] * $product_row["count"]; }, $order)); print_r($sum);// 250总结正如你所看到的那样,掌握主要的数组函数可以是我们的代码更精简且易于阅读。当然,PHP 提供了比列出来的要多得多的数组函数,并且还提供了额外参数及标识参数,但是我觉得本教程中已经涵盖了 PHP 开发者应该掌握的最基本的一些。
另外需要注意的是我们创建了这些函数的示例,所以你可以从相关小节下载和分享给你的团队。
如果你有任何问题,不要犹豫直接在文章的评论表单发表出来就好了。
更多及相关链接php.net 数组函数手册
php.net 匿名函数(闭包)手册
给你的团队下载我们的教程
原文Working With PHP Arrays in the Right Way
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/28989.html
摘要:超过三个参数会导致参数之间的组合过多,你必须对每个单独的参数测试大量不同的情况。拆分这些函数,可以让代码可重用性更高且更易测试。 函数参数不要超过两个 限制函数的参数数量是非常重要的,因为它使你的函数更容易测试。超过三个参数会导致参数之间的组合过多,你必须对每个单独的参数测试大量不同的情况。 没有参数是最理想的情况,一个或两个参数是可以接受的,三个以上则是应该避免的。这很重要的。如果你...
摘要:日期和时间使用类完成读取设置比较和计算日期与时间。单元测试单元测试是从编写开始,贯穿于整个开发周期的一种用于保证函数类和方法的行为与预期一致的编程方法。是应用的单元测试框架的业界标准,其他几个可选框架是行为驱动开发行为驱动开发有两种方式和。 《php之道》阅读地址:http://wulijun.github.io/php-the-right-way/#code_style_guide ...
摘要:权限中心的依赖声明声明依赖关系检查代码规范声明开发依赖命名空间检查代码规范,执行单元测试。单元测试持续交付一切都如此的完美,没有测试,又如何可以证明这件事情的完美,又如何可以保障交付的质量。 序 权限管理是无线运营系统中的核心模块,通过访问控制策略的配置,来约定人与资源的访问关系。 本文着重讲解如何通过PHP来构建一个灵活、通用、安全的权限管理系统。 关于权限 首先我们来聊聊权限。 权...
摘要:将代码写的简洁并且易读易懂是每一位优秀的所应该具备的基本功。前几天在上看到这个项目,感觉很有收获,于是在这里记录一下。 将代码写的简洁并且易读易懂是每一位优秀的coder所应该具备的基本功。 前几天在github上看到clean-code-php这个项目,感觉很有收获,于是在这里记录一下。 使用有意义并且可读的变量名称 Bad: $ymdstr = $moment->format(y-...
摘要:统一的编码规范编码规范往简单说其实就是三个方面换行空格变量命名放在里面,还有一些附加的地方,比如关键字大小写,语法糖的使用与等的问题。这些都是规范代码的重要手段。推广给你的队友团队项目中,队友的配合对整个代码的规范起着决定性的作用。 1. 统一的编码规范 编码规范往简单说其实就是三个方面: 换行 空格 变量命名 放在 PHP 里面,还有一些附加的地方,比如关键字大小写,语法糖的使用...
阅读 2953·2021-11-22 12:06
阅读 575·2021-09-03 10:29
阅读 6442·2021-09-02 09:52
阅读 1995·2019-08-30 15:52
阅读 3380·2019-08-29 16:39
阅读 1166·2019-08-29 15:35
阅读 2043·2019-08-29 15:17
阅读 1368·2019-08-29 11:17