Menu

PHP array_column():从多行数据中取出一列

array_column($rows, 'email') 会把每一行的 email 字段取出来,返回一个一维数组。学习索引键参数、按 id 重新索引行、在对象上使用它,以及配合 array_search 查找某一行。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

array_column($rows, $column) 从一组行的每一行中取出 $column 的值。它把一张记录表变成只含一个字段的一维数组,这正是在使用 implode、in_array、array_sum 或 array_search 之前需要做的。

这些行可以来自任何地方:解码后的 JSON 响应、CSV 文件,或者返回关联数组组成的数组的数据库查询。

用索引键生成键值对

第三个参数指定一个字段,它的值会成为每个结果的键。array_column($users, 'name', 'id') 是生成“id 对应名字”查找表的常用写法,例如用来生成 <select> 下拉列表。

如果两行的索引值相同,后面的行会覆盖前面的行。

用 null 按 id 索引整行

把列参数设为 null,就会保留每一整行,并用索引字段重新设置键。之后按 id 查找某一行就是直接访问键,不需要循环。

索引只需建立一次,之后的每次查找都是瞬间完成的,当你在循环中查找很多 id 时,这一点很重要。

用 array_column 和 array_search 查找一行

要找出哪一行包含某个值,就在这一列中搜索,然后使用返回的位置。用 !== false 检查结果,因为匹配到第一行时返回的是 0。

这依赖于 $users 的键是 0, 1, 2,因为 array_column 返回的是一个列表。如果数组被过滤过、键不连续,先调用 array_values($users)。array_search 一页详细讲解了 false 和 0 的陷阱。

对一列求和、计数或求平均值

array_column 和数学辅助函数配合得很好:先取出字段,再把它们加起来。

如果值要由多个字段计算得出,比如数量乘以价格,就该用 array_map,如最后一行所示。

在对象上使用 array_column

对于一组对象,array_column 读取的是 public 属性。private 和 protected 属性对它不可见。

第二次调用返回了一个空数组:password 是 private 属性,所以每个对象都被跳过了。

缺少字段的行会被跳过

对于缺少该字段的行,array_column 不会补上占位值。结果可能比输入短,所以它的位置和原来的行就对不上了。

第一个结果有两个电话号码,却看不出 Bob 没有号码。用名字作为索引键,就能看出每个号码属于谁;只要某些行可能缺少这个字段,这种写法就更安全。

常见问题

PHP 中 array_column 有什么作用?

它接收一组行(数组或对象),返回每一行中某个字段的值:array_column($users, 'email') 得到一个由邮箱组成的一维数组。没有这个字段的行会被跳过。

怎样从多行数据生成一个键值对数组?

把作为键的字段传给第三个参数:array_column($users, 'name', 'id') 返回 [id => name, ...]。如果第二个参数传 null,即 array_column($users, null, 'id'),就会保留整行,并按 id 建立索引。

某一行缺少该字段时,array_column 会怎样处理?

它会跳过这一行,所以 array_column($people, 'phone') 返回的值可能比行数少,位置也就对不上了。加上索引键 array_column($people, 'phone', 'name'),就能看出每个值来自哪一行。

array_column 能用于对象吗?

能。对于对象数组,它读取 public 属性;当类定义了 __isset 时,也能读取通过 __get 提供的属性。private 和 protected 属性会被跳过。

Coddy 编程语言插图

和 Coddy 一起学编程

开始