PHP 入门教程
PHP 数组函数与排序
本教程共 65 篇 · 第 14 篇 · 更新于 2026-07-24 · 约 4 分钟阅读
PHPPHP8数组函数数组排序数组操作usort
14. PHP 数组函数与排序
本节目标:掌握常用数组操作函数和多种排序方式。学完你能对数组进行增删改查和灵活排序。
14.1 常用数组函数
添加和删除元素
<?php
$arr = ["a", "b"];
// 尾部操作
array_push($arr, "c", "d"); // ["a", "b", "c", "d"]
$last = array_pop($arr); // 删除并返回 "d"
// 头部操作
array_unshift($arr, "z"); // ["z", "a", "b", "c"]
$first = array_shift($arr); // 删除并返回 "z"
// 更简单的写法
$arr[] = "e"; // 相当于 array_push,但更快
?>
查找元素
<?php
$fruits = ["apple", "banana", "orange"];
// 检查是否存在
if (in_array("banana", $fruits)) {
echo "找到了香蕉";
}
// 查找键名
$key = array_search("banana", $fruits); // 1
// 检查键是否存在
if (array_key_exists(1, $fruits)) {
echo "索引 1 存在";
}
?>
数组切片与合并
<?php
$arr = ["a", "b", "c", "d", "e"];
// 截取片段
$slice = array_slice($arr, 1, 3); // ["b", "c", "d"]
// 合并数组
$arr1 = [1, 2];
$arr2 = [3, 4];
$merged = array_merge($arr1, $arr2); // [1, 2, 3, 4]
// 去重
$dup = [1, 2, 2, 3, 3, 3];
$unique = array_unique($dup); // [1, 2, 3]
?>
键值操作
<?php
$assoc = ["name" => "张三", "age" => 25];
// 获取所有键
$keys = array_keys($assoc); // ["name", "age"]
// 获取所有值
$values = array_values($assoc); // ["张三", 25]
// 键值翻转
$flipped = array_flip($assoc); // ["张三" => "name", 25 => "age"]
// 交换键值(注意:值必须能作为有效键)
?>
统计与计算
<?php
$nums = [10, 20, 30, 40];
echo count($nums); // 4
echo array_sum($nums); // 100
echo array_product($nums); // 240000
echo max($nums); // 40
echo min($nums); // 10
// 统计每个值出现的次数
$scores = ["A", "B", "A", "C", "B", "A"];
$count = array_count_values($scores);
// ["A" => 3, "B" => 2, "C" => 1]
?>
14.2 数组排序函数
PHP 提供了多种排序函数,适用于不同场景:
按值排序(索引数组)
<?php
$nums = [3, 1, 4, 1, 5, 9, 2];
// 升序排序
sort($nums);
print_r($nums); // [1, 1, 2, 3, 4, 5, 9]
// 降序排序
rsort($nums);
print_r($nums); // [9, 5, 4, 3, 2, 1, 1]
?>
按键排序(关联数组)
<?php
$ages = ["张三" => 25, "李四" => 30, "王五" => 20];
// 按值升序
asort($ages);
print_r($ages); // ["王五" => 20, "张三" => 25, "李四" => 30]
// 按值降序
arsort($ages);
print_r($ages); // ["李四" => 30, "张三" => 25, "王五" => 20]
// 按键升序
ksort($ages);
print_r($ages); // ["李四" => 30, "王五" => 20, "张三" => 25]
// 按键降序
krsort($ages);
print_r($ages); // ["张三" => 25, "王五" => 20, "李四" => 30]
?>
Tip所有排序函数都是原地排序,直接修改原数组,返回 true/false 表示是否成功。
自定义排序 usort
<?php
$users = [
["name" => "张三", "age" => 25],
["name" => "李四", "age" => 20],
["name" => "王五", "age" => 30]
];
// 按 age 升序排列
usort($users, function($a, $b) {
return $a["age"] <=> $b["age"]; // 太空船运算符
});
print_r($users);
// 李四(20), 张三(25), 王五(30)
?>
14.3 排序函数速查表
| 函数 | 排序依据 | 保持键关联 | 顺序 |
|---|---|---|---|
sort() | 值 | 否(重置为数字键) | 升序 |
rsort() | 值 | 否 | 降序 |
asort() | 值 | 是 | 升序 |
arsort() | 值 | 是 | 降序 |
ksort() | 键 | 是 | 升序 |
krsort() | 键 | 是 | 降序 |
usort() | 自定义 | 否 | 自定义 |
uasort() | 自定义 | 是 | 自定义 |
uksort() | 自定义键 | 是 | 自定义 |
14.4 数组过滤与映射
<?php
$nums = [1, 2, 3, 4, 5, 6];
// array_filter:过滤元素
$evens = array_filter($nums, fn($n) => $n % 2 == 0);
// [2, 4, 6]
// array_map:映射转换
$squares = array_map(fn($n) => $n * $n, $nums);
// [1, 4, 9, 16, 25, 36]
// array_reduce:累积计算
$sum = array_reduce($nums, fn($carry, $n) => $carry + $n, 0);
// 21
// 组合使用
$result = array_map(
fn($n) => $n * 2,
array_filter($nums, fn($n) => $n > 2)
);
// 大于 2 的数乘以 2:[6, 8, 10, 12]
?>
14.5 数组交并差
<?php
$a = [1, 2, 3, 4];
$b = [3, 4, 5, 6];
// 交集
$intersect = array_intersect($a, $b); // [3, 4]
// 差集(在 $a 中但不在 $b 中)
$diff = array_diff($a, $b); // [1, 2]
// 并集(去重合并)
$union = array_unique(array_merge($a, $b)); // [1, 2, 3, 4, 5, 6]
?>
来源:参考了 w3cschool「PHP 数组排序」、runoob「PHP 数组排序」以及 php.net 官方文档,综合改写后所得。