PHP: 数组基础
PHP 的数组不是普通数组——它是一个超级数据结构,既能当列表用,也能当字典用,还能当集合用。在 PHP 中,数组是你使用最频繁的数据类型,没有之一。
1. PHP 数组的本质
PHP 的数组实际上是一个有序映射(ordered map)。用人话说:它把键(key)映射到值(value)上,而且会记住插入的顺序。
PHP
<?php
// 索引数组:键是自动分配的数字(0, 1, 2, ...)
$fruits = ["苹果", "香蕉", "橘子"];
// 关联数组:键是你自己指定的字符串
$user = [
"name" => "小明",
"age" => 25,
"city" => "北京"
];
?>
| 语言 | 列表 | 字典 | PHP 数组 |
|---|---|---|---|
| Python | list |
dict |
array 合一 |
| JavaScript | Array |
Object / Map |
array 合一 |
| PHP | array |
array |
一个东西全搞定 |
2. 创建数组
PHP 有两种创建数组的写法,[] 是新写法(PHP 5.4+),推荐用这个:
PHP
<?php
// 推荐写法(PHP 5.4+)
$arr1 = []; // 空数组
$arr2 = [1, 2, 3]; // 索引数组
$arr3 = ["a" => 1, "b" => 2]; // 关联数组
// 旧写法(兼容老代码)
$arr4 = array();
$arr5 = array(1, 2, 3);
$arr6 = array("a" => 1, "b" => 2);
?>
💡 提示:
[] 比 array() 简洁 5 个字符,没有理由不用它。
3. 访问数组元素
用方括号 [] 通过键来读取或修改元素:
PHP
<?php
$fruits = ["苹果", "香蕉", "橘子"];
echo $fruits[0]; // 苹果(索引从 0 开始)
echo $fruits[1]; // 香蕉
echo $fruits[2]; // 橘子
$fruits[1] = "草莓"; // 修改第二个元素
echo $fruits[1]; // 草莓
// 关联数组用键名来访问
$user = ["name" => "小明", "age" => 25];
echo $user["name"]; // 小明
$user["age"] = 26; // 修改年龄
?>
⚠️ 注意: 访问不存在的键会触发
Warning: Undefined array key。最好先用 isset() 或 array_key_exists() 检查。
4. 添加与删除元素
PHP
<?php
// === 添加元素 ===
$arr = [1, 2];
$arr[] = 3; // 添加到最后(最简单的写法)
// $arr 现在是 [1, 2, 3]
// 或者用 array_push(添加多个时方便)
array_push($arr, 4, 5);
// $arr 现在是 [1, 2, 3, 4, 5]
// 指定键添加
$arr["key"] = "value";
// === 删除元素 ===
unset($arr[2]); // 删除索引为 2 的元素
// $arr 现在是 [1, 2, 4, 5, "key"=>"value"]
// array_pop:删除最后一个
$last = array_pop($arr); // 删除并返回最后一个
// array_shift:删除第一个
$first = array_shift($arr); // 删除并返回第一个
?>
💡 提示:
$arr[] = $val 是 PHP 最常用的添加语法,比 array_push() 更简洁,性能也稍好(不需要函数调用开销)。
5. 遍历数组
PHP
<?php
$fruits = ["苹果", "香蕉", "橘子"];
// foreach 遍历索引数组(只取值)
foreach ($fruits as $fruit) {
echo $fruit . "<br>";
}
// foreach 遍历关联数组(取键和值)
$user = ["name" => "小明", "age" => 25, "city" => "北京"];
foreach ($user as $key => $value) {
echo "{$key}: {$value}<br>";
}
// name: 小明
// age: 25
// city: 北京
?>
foreach 不关心数组是索引还是关联——它都能优雅遍历。这就是 PHP 数组统一性带来的美感。
▶ 示例:遍历多维嵌套数组
PHP
<?php
// 实战:遍历学生成绩单(关联数组 + 索引数组混用)
$classroom = [
["name" => "张三", "scores" => ["语文" => 85, "数学" => 92]],
["name" => "李四", "scores" => ["语文" => 78, "数学" => 88]],
];
foreach ($classroom as $student) {
$total = array_sum($student["scores"]);
echo "{$student['name']} 总分:{$total}<br>";
}
?>
6. 数组调试
PHP
<?php
$user = [
"name" => "小明",
"age" => 25,
"skills" => ["PHP", "MySQL", "JavaScript"]
];
// var_dump:最详细的调试输出(含类型和长度)
var_dump($user);
/*
array(3) {
["name"]=> string(6) "小明"
["age"]=> int(25)
["skills"]=> array(3) { [0]=> ... }
}
*/
// print_r:简洁版(只显示结构,不含类型)
print_r($user);
/*
Array ( [name] => 小明 [age] => 25 [skills] => Array (...) )
*/
// 在 HTML 中用 <pre> 标签让输出更整齐
echo "<pre>";
print_r($user);
echo "</pre>";
?>
💡 提示: 开发时需要看数组结构 →
var_dump();只需要看内容 → echo "<pre>" + print_r();生产环境 → 永远不要直接输出数组,用日志。
7. count() — 统计元素个数
PHP
<?php
$fruits = ["苹果", "香蕉", "橘子"];
echo count($fruits); // 3
$empty = [];
echo count($empty); // 0
// sizeof 是 count 的别名,完全一样
echo sizeof($fruits); // 3
?>
8. 检测数组中是否存在键或值
PHP
<?php
$user = ["name" => "小明", "age" => 25];
// 检查键是否存在
var_dump(array_key_exists("name", $user)); // bool(true)
var_dump(array_key_exists("email", $user)); // bool(false)
// 检查值是否存在
var_dump(in_array("小明", $user)); // bool(true)
var_dump(in_array("小红", $user)); // bool(false)
?>
▶ 示例:安全的数组访问模式
PHP
<?php
// 不确定键是否存在时,先检查再用
$user = ["name" => "小明"];
// 安全模式
if (isset($user["age"])) {
echo $user["age"];
} else {
echo "年龄未设置";
}
// 简洁模式:用 ?? 提供默认值
$age = $user["age"] ?? "未知";
echo $age; // 未知(因为 age 键不存在)
?>
💡 提示:
isset() 和 ?? 的区别:isset($arr['key']) 检查键存在且值不为 null,array_key_exists('key', $arr) 只检查键存在(即使值为 null 也返回 true)。
❓ 常见问题
Q PHP 数组和 JavaScript 数组有什么区别?
A PHP 数组是一个全能结构(列表 + 字典合一),JavaScript 的数组(Array)只是列表,对象(Object)/Map 才是字典。在 PHP 中,
[0=>"a", 1=>"b"]和 ["x"=>1, "y"=>2] 是同一类型。Q 索引数组和关联数组有什么区别?
A 对 PHP 来说,本质上没有区别——都是有序映射。索引数组的键是自动分配的从 0 开始的整数,关联数组的键是自定义的字符串。你可以混用:
["a"=>1, 2=>3, 4=>5] 完全合法。Q 为什么 foreach 时原数组没变?
A 除非你用
&$val 引用遍历,否则 foreach ($arr as $val) 中 $val 是数组元素的副本,修改它不影响原数组。📖 小节
- PHP 数组是有序映射,索引数组和关联数组本质上是同一种类型
[]创建数组,$arr[键]访问/修改元素$arr[] = $val添加元素,unset($arr[键])删除元素foreach ($arr as $key => $val)遍历数组var_dump()/print_r()调试数组结构isset()/??/array_key_exists()安全访问count()统计元素个数,in_array()检查值,array_key_exists()检查键
📝 作业
- 创建一个包含 5 个城市名的索引数组,用 foreach 输出编号列表,再用
$arr[]追加一个城市后重新输出。 - 创建一个包含至少 3 个属性的用户关联数组(姓名、年龄、邮箱、技能列表),用 foreach 遍历并以表格形式展示。对技能列表(又是一个数组)做特殊处理——用"、"号分隔输出。
- 写一个函数
safeGet($arr, $key, $default),安全地从数组中取指定键的值,如果键不存在则返回默认值。