PHP 数组
PHP 数组是这门语言最重要的数据结构。它不是传统的"列表",而是一个有序字典——既能当下标连续的列表,又能当键值对的字典,还能嵌套成树。PHP 程序里 80% 的数据处理都围绕数组展开,理解数组 = 理解 PHP。
1. 数组的本质
PHP 数组本质是有序映射,key→value。key 可以是 int 或 string,value 可以是任意类型。即使你只给值(如 [10, 20, 30]),PHP 也会自动给数字 key(0、1、2)。这种统一设计极其灵活——同一个数组可以同时有数字键和字符串键(虽然不推荐混用)。
2. 索引数组
当下标全是连续数字时,它就是"列表"。用方括号 [] 创建(PHP 5.4+ 推荐写法):
<?php
// 索引数组(数字下标,从 0 开始)
$fruits = ["苹果", "香蕉", "橙子"];
// 等价的老写法(PHP 5.4 前)
$fruits = array("苹果", "香蕉", "橙子");
// 访问
echo $fruits[0]; // 苹果
echo $fruits[2]; // 橙子
// 修改
$fruits[1] = "葡萄";
// 末尾添加
$fruits[] = "西瓜";
array_push($fruits, "梨", "榴莲");
// 长度
echo count($fruits); // 6
// 遍历
foreach ($fruits as $i => $f) {
echo "[{$i}] {$f}\n";
}几个要点:
- 下标从 0 开始(不是 1)。
$arr[] = value在末尾追加,等价于array_push。count()返回数组长度。- 访问不存在的下标会报 Warning(PHP 8 起为 Warning,之前为 Notice)。
3. 关联数组
当 key 是字符串时,它就是"字典"。关联数组是 PHP Web 开发的核心——$_POST、$_SESSION、配置、数据库记录全是关联数组:
<?php
// 关联数组(字符串下标)
$user = [
"name" => "小明",
"age" => 25,
"city" => "北京",
"email" => "xm@test.com",
];
// 访问
echo $user["name"]; // 小明
// 修改
$user["age"] = 26;
// 新增键
$user["phone"] = "13800000000";
// 删除键
unset($user["email"]);
// 检查键是否存在
if (isset($user["city"])) {
echo "城市: " . $user["city"];
}
// 遍历键值
foreach ($user as $key => $value) {
echo "{$key} => {$value}\n";
}4. 多维数组
数组的元素可以是另一个数组,这就是多维数组。常用于表示表格、JSON 数据、嵌套结构:
<?php
// 多维数组:数组里的数组
$users = [
["id" => 1, "name" => "小明", "age" => 25],
["id" => 2, "name" => "小红", "age" => 22],
["id" => 3, "name" => "小刚", "age" => 28],
];
// 访问
echo $users[0]["name"]; // 小明
echo $users[2]["age"]; // 28
// 修改
$users[1]["age"] = 23;
// 遍历二维数组
foreach ($users as $u) {
echo "{$u['id']}: {$u['name']} ({$u['age']}岁)\n";
}
// 矩阵(数字-数字)
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
echo $matrix[1][2]; // 6PHP 多维数组就是"数组的数组",理论可以无限嵌套。实际项目里 2~3 层最常见,超过 3 层建议考虑用对象(第 13 章面向对象)。
5. 数组常用函数(必背)
PHP 内置了 80+ 个数组函数,这里列最常用的:
<?php
$nums = [3, 1, 4, 1, 5, 9, 2, 6];
// 数量
count($nums); // 8
// 排序(原地修改)
sort($nums); // 升序
rsort($nums); // 降序
// 关联数组按值/键升序:asort / ksort
// 查找
in_array(5, $nums); // true(值是否存在)
array_search(5, $nums); // 下标,找不到返回 false
array_keys($nums); // 所有键
array_values($nums); // 所有值
// 切片
array_slice($nums, 2, 3); // 从下标 2 取 3 个
// 合并
$all = array_merge([1, 2], [3, 4]); // [1, 2, 3, 4]
// 去重
$unique = array_unique([1, 1, 2, 3, 3]); // [1, 2, 3]
// 反转
$reversed = array_reverse([1, 2, 3]); // [3, 2, 1]排序函数特别多,记几个核心:sort(值升序,重新索引)、asort(值升序,保留键)、ksort(按键升序)、usort(自定义比较)。对应的有 r 开头的降序版本。
6. 高阶函数:map / filter / reduce
这三个函数来自函数式编程,在 PHP 里用得非常多,配合箭头函数极其优雅:
<?php
$nums = [1, 2, 3, 4, 5];
// array_map:对每个元素应用函数
$doubled = array_map(fn($n) => $n * 2, $nums);
// [2, 4, 6, 8, 10]
// array_filter:过滤
$even = array_filter($nums, fn($n) => $n % 2 === 0);
// [2, 4](注意:保留原键!)
// array_filter 后通常 reindex
$even = array_values($even); // 重新索引为 [0, 1]
// array_reduce:聚合
$sum = array_reduce($nums, fn($carry, $n) => $carry + $n, 0);
// 15
// 组合使用:计算所有偶数的平方和
$result = array_sum(
array_map(fn($n) => $n * $n,
array_filter($nums, fn($n) => $n % 2 === 0)
)
); // 20 (= 2^2 + 4^2)
// 排序回调
$users = [["name" => "Bob", "age" => 30], ["name" => "Amy", "age" => 25]];
usort($users, fn($a, $b) => $a["age"] <=> $b["age"]);
// 按年龄升序几个易踩的坑:
- array_filter 保留原键:过滤后下标不连续(如 [0, 2, 4]),需要
array_values重建索引。 - array_map 可以接收多个数组:并行遍历两个数组,元素对应相加(详见下面 const 示例)。
- usort 是原地排序,返回 true/false,数组本身被修改。
7. 解构、extract、compact
PHP 7.1+ 引入了数组解构语法,从数组里一次性取多个变量:
<?php
// list()/[] 解构(PHP 7.1+ 简化语法)
$user = ["小明", 25, "北京"];
// 老语法
list($name, $age, $city) = $user;
// 新语法(推荐)
[$name, $age, $city] = $user;
// 关联数组解构(PHP 7.1+)
$user = ["name" => "小明", "age" => 25];
["name" => $name, "age" => $age] = $user;
// extract:把数组键变成变量(谨慎使用)
$data = ["x" => 1, "y" => 2];
extract($data);
echo $x; // 1
echo $y; // 2
// compact:把变量打包成数组(反过来)
$name = "小明"; $age = 25;
$arr = compact("name", "age");
// ["name" => "小明", "age" => 25]extract / compact 在模板渲染里常见,但要谨慎——extract 会把数组键直接变成变量,可能覆盖已有变量(存在注入风险),不要用在用户数据上。
8. 数组与 JSON
PHP 数组和 JSON 互转是 Web 开发的日常:
json_encode($arr)— PHP 数组转 JSON 字符串。json_decode($json, true)— JSON 转 PHP 关联数组(不加 true 转成 object)。- 第二个参数
true很关键——不加的话返回stdClass对象,新手容易困惑。
小结
这一章你掌握了 PHP 数组的全部核心:索引数组、关联数组、多维数组、常用函数、map/filter/reduce、解构、JSON 互转。下一篇字符串——Web 开发的另一大主战场。
← 上一篇 PHP 函数
下一篇 PHP 字符串 →