数据库查询返回的结果集通常是一个二维数组,每条记录是一个子数组。有时候你只想拿到所有记录的某个字段,比如所有用户的姓名、所有订单的金额。
以前的做法是用foreach循环去取,代码写起来又长又不好看。PHP 5.5引入了array_column(),一行代码搞定这件事。
语法格式
array_column(array $array, mixed $column_key, mixed $index_key = null): array
参数说明:
| 参数 | 说明 | 必填? |
|---|---|---|
| array | 多维数组(要处理的目标) | 必填 |
| column_key | 要提取的列名(整数索引或字符串键名) | 必填 |
| index_key | 用哪一列的值作为返回数组的键名 | 可选 |
返回值: 从原数组中提取的单列值组成的新数组。
三个参数怎么用
第一个参数:你的数据源,必须是数组(通常是多维数组或对象数组)。
第二个参数:你要取哪一列。可以是字符串键名(关联数组),也可以是整数索引(索引数组)。传null时返回整个子数组,这个用法配合第三个参数挺有意思。
第三个参数:指定返回数组的键名用哪一列的值。不传的话默认从0开始数字索引。
示例1:提取关联数组中的某一列
<?php
$students = [
"code001" => ["name" => "张伟", "score" => 85, "city" => "北京"],
"code002" => ["name" => "李芳", "score" => 92, "city" => "上海"],
"code003" => ["name" => "王磊", "score" => 78, "city" => "广州"]
];
$names = array_column($students, "name");
print_r($names);
?>
输出:
Array
(
[0] => 张伟
[1] => 李芳
[2] => 王磊
)
原来的键名code001、code002、code003没了,返回的是索引数组。
示例2:用第三个参数指定返回数组的键名
<?php
$students = [
["id" => 1001, "name" => "张伟", "score" => 85],
["id" => 1002, "name" => "李芳", "score" => 92],
["id" => 1003, "name" => "王磊", "score" => 78]
];
$result = array_column($students, "score", "id");
print_r($result);
?>
输出:
Array
(
[1001] => 85
[1002] => 92
[1003] => 78
)
这就很实用了:用id作为键名,分数作为值。平时做数据映射、查询优化经常这么用。
示例3:提取索引数组中的某一列
<?php
$orders = [
[101, "键盘", 299, "已发货"],
[102, "鼠标", 89, "待付款"],
[103, "显示器", 1250, "已完成"]
];
$products = array_column($orders, 1); // 第二列(索引1)
print_r($products);
?>
输出:
Array
(
[0] => 键盘
[1] => 鼠标
[2] => 显示器
)
用整数索引也能取,适合处理那种从CSV或老数据源读出来的索引数组。
示例4:第二个参数传null配合第三个参数
<?php
$data = [
["uid" => 101, "username" => "alice", "level" => 3],
["uid" => 102, "username" => "bob", "level" => 5],
["uid" => 103, "username" => "carol", "level" => 2]
];
$result = array_column($data, null, "uid");
print_r($result);
?>
输出:
Array
(
[101] => Array ([uid] => 101 [username] => alice [level] => 3)
[102] => Array ([uid] => 102 [username] => bob [level] => 5)
[103] => Array ([uid] => 103 [username] => carol [level] => 2)
)
第二个参数传null,返回整个子数组,但键名变成了uid的值。这相当于用某列的值重新索引整个数组,代码号学习编程时处理API返回的数据经常用到。
个人经验分享
-
处理对象数组怎么办? array_column()不支持直接传对象数组。不过可以用
array_map()配合getter,或者先把对象转数组。PHP 7之后也可以用array_column(array_map('get_object_vars', $objects), 'field')。 -
性能方面的感受:我自己测试过,一个1万条记录的数组用array_column()比foreach循环大概快30%左右。PHP内置函数底层是C实现,能用的地方就用,不用手写循环。
-
取不到列键名的情况:如果某个子数组里没有指定的column_key,PHP不会报错,只会在那个位置返回null。建议确保数据结构统一,或者用
array_filter()把空值过滤掉。 -
常见应用场景:
-
从数据库结果集中提取特定字段
-
将一个数组重新索引(用第三个参数)
-
构建id => 值的映射表用于快速查找
-
把二维数组转成一维数组方便做运算(比如算总分、平均值)
-
示例5:实际项目中典型用法
<?php
// 模拟从数据库查出来的结果集
$users = [
["user_id" => 1, "name" => "代码号001", "points" => 320],
["user_id" => 2, "name" => "代码号002", "points" => 578],
["user_id" => 3, "name" => "代码号003", "points" => 412],
["user_id" => 4, "name" => "代码号004", "points" => 295]
];
// 提取所有用户ID
$allIds = array_column($users, "user_id");
// 提取所有分数,用用户ID做键名
$pointsMap = array_column($users, "points", "user_id");
echo "用户ID列表:" . implode(", ", $allIds) . "\n";
print_r($pointsMap);
?>
本节课程知识要点
-
array_column()从二维数组中提取指定列的值 -
第二个参数传null可返回完整子数组,配合第三个参数重设索引
-
第三个参数指定返回数组的键名取自哪一列
-
支持字符串键名和整数索引两种方式
-
原数组不会被修改,返回新数组
-
指定列不存在时对应位置返回null
-
适用于数据库结果集、CSV数据、API响应等场景