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";
}

几个要点:

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];          // 6

PHP 多维数组就是"数组的数组",理论可以无限嵌套。实际项目里 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"]);
// 按年龄升序

几个易踩的坑:

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 开发的日常:

小结

这一章你掌握了 PHP 数组的全部核心:索引数组、关联数组、多维数组、常用函数、map/filter/reduce、解构、JSON 互转。下一篇字符串——Web 开发的另一大主战场。

← 上一篇 PHP 函数

下一篇 PHP 字符串

✈️💬