← PHP中的array_change_key_case():批量转换数组键名大小写 PHP中的array_combine():两个数组合并成一个 →

PHP中的array_column():从二维数组里抽一列出来

原创 2026-05-22 PHP 已有人查阅

数据库查询返回的结果集通常是一个二维数组,每条记录是一个子数组。有时候你只想拿到所有记录的某个字段,比如所有用户的姓名、所有订单的金额。

以前的做法是用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返回的数据经常用到。

个人经验分享

  1. 处理对象数组怎么办? array_column()不支持直接传对象数组。不过可以用array_map()配合getter,或者先把对象转数组。PHP 7之后也可以用array_column(array_map('get_object_vars', $objects), 'field')

  2. 性能方面的感受:我自己测试过,一个1万条记录的数组用array_column()比foreach循环大概快30%左右。PHP内置函数底层是C实现,能用的地方就用,不用手写循环。

  3. 取不到列键名的情况:如果某个子数组里没有指定的column_key,PHP不会报错,只会在那个位置返回null。建议确保数据结构统一,或者用array_filter()把空值过滤掉。

  4. 常见应用场景:

    • 从数据库结果集中提取特定字段

    • 将一个数组重新索引(用第三个参数)

    • 构建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响应等场景

← PHP中的array_change_key_case():批量转换数组键名大小写 PHP中的array_combine():两个数组合并成一个 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号