PHP 数组函数大全
目录
- 1. 创建与基础
- 2. 类型判断与属性
- 3. 键值访问与指针
- 4. 增删改元素
- 5. 遍历与回调处理
- 6. 合并 / 拆分 / 切片
- 7. 查找 / 过滤 / 搜索
- 8. 集合运算(交 / 并 / 差)
- 9. 排序
- 10. 数学与统计
- 11. 栈 / 队列 / 集合
- 12. 变量 ↔ 数组 互转
- 实战避坑要点
- PHP 版本新增对照
1. 创建与基础
| 函数 | 说明 |
|---|---|
array() / [] |
字面量创建(推荐 []) |
range($start, $end [, $step]) |
生成连续范围数组 |
array_fill($i, $n, $v) |
用值填充 $n 个元素的索引数组 |
array_fill_keys($keys, $v) |
用指定键填充同一值 |
compact(...$vars) |
变量名 → 键值对(见 12) |
array_column($arr, $col [, $idx]) |
提取二维数组某列(可指定下标列) |
php
// 创建与生成
$list = [1, 2, 3]; // 推荐字面量
$nums = range(1, 10, 2); // [1,3,5,7,9]
$filled = array_fill(0, 3, 'x'); // ['x','x','x']
$byKeys = array_fill_keys(['a','b'], 0); // ['a'=>0,'b'=>0]
$rows = [
['id' => 1, 'name' => 'A'],
['id' => 2, 'name' => 'B'],
];
$names = array_column($rows, 'name'); // ['A','B']
$map = array_column($rows, 'name', 'id'); // [1=>'A', 2=>'B']
2. 类型判断与属性
| 函数 | 说明 |
|---|---|
is_array($v) |
是否数组 |
count($arr [, $mode]) |
元素数(COUNT_RECURSIVE 递归计) |
array_is_list($arr) |
(PHP 8.1) 是否从 0 连续索引的「列表」 |
array_key_exists($k, $arr) |
键是否存在(不忽略 null,区别于 isset) |
in_array($v, $arr [, $strict]) |
值是否存在(建议开 $strict) |
array_search($v, $arr [, $strict]) |
返回值对应的键,不存在返回 false |
array_keys($arr [, $v] [, $strict]) |
返回所有键 / 匹配值的键 |
array_values($arr) |
返回所有值(重置数字索引) |
array_count_values($arr) |
统计每个值出现次数 |
php
$arr = ['a' => 1, 'b' => null];
isset($arr['b']); // false(null 视为未设置)
array_key_exists('b', $arr); // true
array_is_list([1, 2, 3]); // true
array_is_list(['a' => 1]); // false
in_array('1', [1, 2], true); // false(严格比较,类型不同)
3. 键值访问与指针
| 函数 | 说明 |
|---|---|
array_key_first($arr) / array_key_last($arr) |
(PHP 7.3) 首尾键 |
current() / key() / next() / prev() / reset() / end() |
数组内部指针操作 |
php
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
array_key_first($arr); // 'a'
array_key_last($arr); // 'c'
reset($arr); // 指针移到首位
while ($k = key($arr)) {
echo $k . ':' . current($arr);
next($arr);
}
4. 增删改元素
| 函数 | 说明 |
|---|---|
array_push($arr, ...$v) / array_pop($arr) |
尾部压入 / 弹出(返回元素) |
array_unshift($arr, ...$v) / array_shift($arr) |
头部插入 / 移除 |
array_splice($arr, $off [, $len] [, $repl]) |
切开替换(最灵活) |
array_pad($arr, $len, $v) |
补齐到指定长度 |
unset($arr[$k]) |
删除指定元素(语言结构) |
php
$stack = [1, 2];
array_push($stack, 3, 4); // $stack = [1,2,3,4]
$last = array_pop($stack); // $last=4, $stack=[1,2,3]
$tmp = [1, 2, 3, 4, 5];
array_splice($tmp, 1, 2, ['x', 'y']); // [1,'x','y',4,5]
unset($tmp[0]); // 删除键 0(注意:不会重置索引)
$tmp = array_values($tmp); // 重置数字索引
5. 遍历与回调处理
| 函数 | 说明 |
|---|---|
array_map($cb, $arr1 [, $arr2...]) |
逐元素映射,返回新数组 |
array_walk($arr, $cb [, $ud]) |
原地遍历(引用修改),返回 bool |
array_walk_recursive($arr, $cb) |
递归遍历多维数组 |
array_filter($arr [, $cb] [, $mode]) |
过滤(ARRAY_FILTER_USE_KEY/USE_BOTH) |
array_reduce($arr, $cb [, $init]) |
归约(累加 / 汇总) |
array_reverse($arr [, $keep]) |
反转 |
array_flip($arr) |
键值互换(值需可哈希) |
array_unique($arr [, $flags]) |
去重(SORT_STRING/NUMERIC/...) |
array_replace($a, $b...) / array_replace_recursive() |
用后续数组覆盖前面 |
array_change_key_case($arr [, $case]) |
键名大小写转换 |
array_all($arr, $cb) / array_any($arr, $cb) |
(PHP 8.4) 全满足 / 任一满足 |
array_find($arr, $cb) / array_find_key($arr, $cb) |
(PHP 8.4) 首个匹配值 / 键 |
php
// map:批量处理
$squares = array_map(fn($n) => $n ** 2, [1, 2, 3]); // [1,4,9]
// filter:保留偶数
$evens = array_filter([1, 2, 3, 4], fn($n) => $n % 2 === 0); // [2,4]
// reduce:求和
$sum = array_reduce([1, 2, 3], fn($c, $n) => $c + $n, 0); // 6
// PHP 8.4 新函数
$arr = [['id' => 1, 'ok' => true], ['id' => 2, 'ok' => false]];
array_all($arr, fn($x) => $x['ok']); // false
array_any($arr, fn($x) => $x['ok']); // true
array_find($arr, fn($x) => $x['id'] === 2); // ['id'=>2,'ok'=>false]
6. 合并 / 拆分 / 切片
| 函数 | 说明 |
|---|---|
array_merge($a, $b...) |
合并(数字键重排,字符串键覆盖) |
array_merge_recursive($a, $b...) |
递归合并(同名键变数组) |
array_combine($keys, $vals) |
两数组分别作键 / 值 |
array_chunk($arr, $size [, $keep]) |
分块为二维数组 |
array_slice($arr, $off [, $len] [, $keep]) |
取子数组(不修改原数组) |
php
$a = ['a' => 1, 'b' => 2];
$b = ['b' => 3, 'c' => 4];
array_merge($a, $b); // ['a'=>1,'b'=>3,'c'=>4](后者覆盖)
// + 运算符:仅补充缺失键,不覆盖
$a + $b; // ['a'=>1,'b'=>2,'c'=>4]
$keys = ['name', 'age'];
$vals = ['Andy', 30];
array_combine($keys, $vals); // ['name'=>'Andy','age'=>30]
array_chunk(range(1, 5), 2); // [[1,2],[3,4],[5]]
7. 查找 / 过滤 / 搜索
| 函数 | 说明 |
|---|---|
array_search / in_array |
见 2 |
array_filter |
见 5 |
array_key_exists |
见 2 |
array_rand($arr [, $n]) |
随机返回 1 个或多个键 |
array_values |
见 2 |
php
$fruits = ['a' => 'apple', 'b' => 'banana'];
$key = array_search('banana', $fruits, true); // 'b'
$pick = array_rand($fruits, 1); // 随机键名
8. 集合运算(交 / 并 / 差)
| 函数 | 说明 |
|---|---|
array_intersect($a, $b...) |
值交集(比较值) |
array_intersect_key / _assoc / _ukey / _uassoc |
按键 / 键值 / 自定义比较 |
array_diff($a, $b...) |
值差集 |
array_diff_key / _assoc / _ukey / _uassoc |
按键 / 键值 / 自定义比较 |
php
$a = [1, 2, 3, 4];
$b = [2, 4, 6];
array_intersect($a, $b); // [2, 4]
array_diff($a, $b); // [1, 3]
// 按键取交集(常用于过滤白名单字段)
$allowed = ['name' => 1, 'age' => 1];
array_intersect_key($input, $allowed);
9. 排序
排序函数默认修改原数组并返回
bool;$flags常用SORT_REGULAR / NUMERIC / STRING / NATURAL。
| 函数 | 说明 |
|---|---|
sort() / rsort() |
值升序 / 降序(重置数字键) |
asort() / arsort() |
保持键值关联的升序 / 降序 |
ksort() / krsort() |
按键升序 / 降序 |
natsort() / natcasesort() |
自然顺序(大小写不敏感) |
usort($arr, $cb) / uasort() / uksort() |
自定义回调排序 |
array_multisort(...) |
多数组 / 多列联动排序 |
shuffle($arr) |
随机打乱(重置键) |
php
$data = [
['name' => 'B', 'score' => 80],
['name' => 'A', 'score' => 90],
];
// 按 score 降序
usort($data, fn($x, $y) => $y['score'] <=> $x['score']);
$names = ['img12', 'img10', 'img2'];
natsort($names); // ['img2','img10','img12'](自然排序)
10. 数学与统计
| 函数 | 说明 |
|---|---|
array_sum($arr) / array_product($arr) |
求和 / 求积 |
max($arr) / min($arr) |
数组极值(多参数时按参数比较) |
array_reduce |
见 5(自定义聚合) |
count |
见 2 |
php
array_sum([1, 2, 3]); // 6
array_product([2, 3, 4]); // 24
max([3, 1, 4]); // 4
11. 栈 / 队列 / 集合
| 函数 | 说明 |
|---|---|
array_push / array_pop |
栈(LIFO) |
array_unshift / array_shift |
队列(FIFO,shift 性能 O(n)) |
array_unique / array_diff / array_intersect |
集合去重 / 差 / 交 |
php
// 队列:用 SPL 更优(高频场景)
$queue = new SplQueue();
$queue->enqueue('a');
$queue->enqueue('b');
$queue->dequeue(); // 'a'
12. 变量 ↔ 数组 互转
| 函数 | 说明 |
|---|---|
compact(...$vars) |
变量名 → ['var' => $val] |
extract($arr [, $flags]) |
数组键值 → 同名变量(⚠️ 注意变量覆盖安全) |
explode($d, $s [, $n]) / implode($glue, $arr) |
字符串 ↔ 数组(字符串函数,高频搭配) |
[$a, $b] = $arr / list() |
语言结构,解构赋值 |
php
$name = 'Andy';
$age = 30;
compact('name', 'age'); // ['name'=>'Andy','age'=>30]
$str = 'a,b,c';
explode(',', $str); // ['a','b','c']
implode('-', [1, 2, 3]); // '1-2-3'
[$x, $y] = [10, 20]; // $x=10, $y=20
实战避坑要点
- 严格比较:
in_array/array_search务必传第三个参数true,否则"0" == false类比较会出错。 - 大数组删除头部:
array_shift是 O(n) 整体前移;高频队首选SplDoublyLinkedList/SplQueue或array_pop替代。 - 排序改原数组:排序类函数返回
bool而非新数组,不要$x = sort($arr)再用$x。 +运算符 vsarray_merge:$a + $b仅补充$a缺失的键(不覆盖);array_merge字符串键后者覆盖前者。array_unique比较标志:默认按字符串比较,数字数组建议显式传SORT_NUMERIC。extract()安全:会覆盖当前作用域同名变量,生产环境谨慎使用(Webman 控制器中尤其注意)。- PHP 8.x 红利:
array_is_list、array_all/any、array_find/find_key已替代大量手写循环,优先使用。
PHP 版本新增对照
| 版本 | 新增数组函数 |
|---|---|
| 7.3 | array_key_first()、array_key_last() |
| 7.4 | 箭头函数 fn()(大幅简化 array_map/filter/reduce 回调) |
| 8.0 | 联合类型、命名参数(部分数组函数支持) |
| 8.1 | array_is_list() |
| 8.4 | array_all()、array_any()、array_find()、array_find_key() |
本文档为速查参考,完整函数签名与边界行为以 PHP 官方手册 为准。
评论 (0)
发表评论