PHP 数组函数大全

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

实战避坑要点

  1. 严格比较in_array / array_search 务必传第三个参数 true,否则 "0" == false 类比较会出错。
  2. 大数组删除头部array_shift 是 O(n) 整体前移;高频队首选 SplDoublyLinkedList / SplQueuearray_pop 替代。
  3. 排序改原数组:排序类函数返回 bool 而非新数组,不要 $x = sort($arr) 再用 $x
  4. + 运算符 vs array_merge$a + $b 仅补充 $a 缺失的键(不覆盖);array_merge 字符串键后者覆盖前者。
  5. array_unique 比较标志:默认按字符串比较,数字数组建议显式传 SORT_NUMERIC
  6. extract() 安全:会覆盖当前作用域同名变量,生产环境谨慎使用(Webman 控制器中尤其注意)。
  7. PHP 8.x 红利array_is_listarray_all/anyarray_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)

发表评论