PHP 数组

数组是 PHP 中最强大、最常用的数据结构。与很多语言不同,PHP 的数组实际上是一个有序映射,可以同时充当列表、哈希表、字典、队列、栈等多种数据结构。PHP 数组的键可以是整数(索引数组)或字符串(关联数组),值可以是任意类型,包括另一个数组(多维数组)。

在实际开发中,数组无处不在:数据库查询结果、表单数据、配置信息、API 响应……几乎所有数据都以数组形式流转。熟练掌握数组操作是 PHP 开发的核心技能。

创建数组

PHP 实例
// 索引数组(键从 0 开始自动递增)
$fruits = ["苹果", "香蕉", "橙子"];
$nums   = [1, 2, 3, 4, 5];

// 关联数组(自定义字符串键) $user = [ "name" => "张三", "age" => 25, "email" => "zhangsan@example.com", "city" => "北京", ];

// 混合键 $mixed = [0 => "zero", "one" => 1, 2 => "two"];

// 多维数组 $students = [ ["name" => "张三", "score" => 85, "grade" => "B"], ["name" => "李四", "score" => 92, "grade" => "A"], ["name" => "王五", "score" => 78, "grade" => "C"], ];

// range() 快速创建连续数组 $numbers = range(1, 10); // [1,2,3,...,10] $letters = range('a', 'z'); // ['a','b',...,'z'] $evens = range(0, 20, 2); // [0,2,4,...,20] ``

访问与修改

`php $fruits = ["苹果", "香蕉", "橙子"];

// 访问 echo $fruits[0]; // 苹果 echo $fruits[2]; // 橙子

// 修改 $fruits[1] = "葡萄";

// 追加 $fruits[] = "西瓜"; // 自动使用下一个整数键 $fruits[10] = "草莓"; // 指定键

// 关联数组 $user = ["name" => "张三", "age" => 25]; echo $user["name"]; // 张三 $user["city"] = "北京"; // 新增键 $user["age"] = 26; // 修改值

// 多维数组访问 echo $students[0]["name"]; // 张三 echo $students[1]["score"]; // 92 `

常用数组函数

增删操作

`php $arr = [1, 2, 3];

// 末尾操作 array_push($arr, 4, 5); // 末尾添加多个 → [1,2,3,4,5] $last = array_pop($arr); // 删除并返回末尾 → $last=5, $arr=[1,2,3,4]

// 开头操作 array_unshift($arr, 0); // 开头添加 → [0,1,2,3,4] $first = array_shift($arr); // 删除并返回开头 → $first=0, $arr=[1,2,3,4]

// 删除指定元素 unset($arr[1]); // 删除索引1,键不重排 $arr = array_values($arr); // 重新索引 → [1,3,4]

// splice:删除并可插入 array_splice($arr, 1, 1, [10, 20]); // 从索引1删除1个,插入10和20 `

查找与搜索

`php $fruits = ["苹果", "香蕉", "橙子", "香蕉"];

// 判断值是否存在 var_dump(in_array("香蕉", $fruits)); // true var_dump(in_array("西瓜", $fruits)); // false

// 查找值的键 echo array_search("橙子", $fruits); // 2 echo array_search("香蕉", $fruits); // 1(返回第一个匹配的键)

// 统计值出现次数 $counts = array_count_values($fruits); echo $counts["香蕉"]; // 2

// 判断键是否存在 var_dump(array_key_exists("name", $user)); // true var_dump(isset($user["name"])); // true(同时检查非null) `

排序

`php $nums = [3, 1, 4, 1, 5, 9, 2, 6];

sort($nums); // 升序(重新索引) rsort($nums); // 降序(重新索引)

$assoc = ["banana" => 2, "apple" => 5, "cherry" => 1]; asort($assoc); // 按值升序(保留键名) arsort($assoc); // 按值降序(保留键名) ksort($assoc); // 按键名升序 krsort($assoc); // 按键名降序

// 自定义排序 $students = [ ["name" => "张三", "score" => 85], ["name" => "李四", "score" => 92], ["name" => "王五", "score" => 78], ]; usort($students, fn($a, $b) => $b["score"] - $a["score"]); // 按分数降序 `

高阶函数

这三个函数是函数式编程风格的核心,掌握它们能大幅简化数组处理代码:

`php $prices = [100, 200, 300, 400, 500];

// array_map:对每个元素执行操作,返回新数组 $discounted = array_map(fn($p) => $p * 0.8, $prices); // [80, 160, 240, 320, 400]

// 多数组映射 $quantities = [2, 3, 1, 4, 2]; $totals = array_map(fn($p, $q) => $p * $q, $prices, $quantities); // [200, 600, 300, 1600, 1000]

// array_filter:过滤元素,返回满足条件的子数组 $expensive = array_filter($prices, fn($p) => $p > 250); // [300, 400, 500](键名保留)

// 过滤后重新索引 $expensive = array_values(array_filter($prices, fn($p) => $p > 250));

// array_reduce:归并为单一值 $total = array_reduce($prices, fn($carry, $item) => $carry + $item, 0); // 1500

$maxPrice = array_reduce($prices, fn($carry, $item) => max($carry, $item), 0); // 500 `

合并与切片

`php $a = [1, 2, 3]; $b = [4, 5, 6];

// 合并(索引数组会重新索引,关联数组后者覆盖前者) $merged = array_merge($a, $b); // [1,2,3,4,5,6]

// 展开合并(PHP 7.4+,保留键名) $merged2 = [...$a, ...$b]; // [1,2,3,4,5,6]

// 切片 $sliced = array_slice($merged, 1, 3); // [2,3,4] $sliced = array_slice($merged, -2); // [5,6](从末尾)

// 去重 $unique = array_unique([1, 2, 2, 3, 3, 4]); // [1,2,3,4]

// 翻转键值 $flipped = array_flip(["a" => 1, "b" => 2]); // [1=>"a", 2=>"b"]

// 列提取(从多维数组提取某列) $names = array_column($students, "name"); // ["张三","李四","王五"] $byName = array_column($students, null, "name"); // 以name为键的关联数组 `

数组解构

`php // 列表赋值 [$first, $second, $third] = [1, 2, 3]; echo $first; // 1

// 跳过元素 [, $second] = [1, 2, 3]; echo $second; // 2

// 关联数组解构 ["name" => $name, "age" => $age] = $user; echo $name; // 张三

// 在 foreach 中解构 foreach ($students as ["name" => $name, "score" => $score]) { echo "$name: $score\n"; }

常见问题

Q:PHP 数组和其他语言的数组有什么不同? A:PHP 数组本质是有序映射,键可以是整数或字符串,值可以是任意类型。这使得 PHP 数组比大多数语言的数组更灵活,可以同时充当列表、字典、集合等多种数据结构。

Q:array_merge 和 + 运算符合并数组有什么区别? A:array_merge 对索引数组会重新编号,关联数组后者覆盖前者;+ 运算符保留左边数组的键,只添加右边数组中左边没有的键。通常推荐使用 array_merge

Q:如何判断一个变量是否是数组? A:使用 is_array($var) 函数。empty($arr) 可以判断数组是否为空,count($arr) 返回数组元素数量。

Q:array_map 和 foreach 哪个更好? A:array_map 更函数式、更简洁,适合简单的转换操作;foreach` 更灵活,适合复杂逻辑。性能上差异不大,优先考虑代码可读性。