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 是数组元素的副本,修改它不影响原数组。

📖 小节

📝 作业

  1. 创建一个包含 5 个城市名的索引数组,用 foreach 输出编号列表,再用 $arr[] 追加一个城市后重新输出。
  2. 创建一个包含至少 3 个属性的用户关联数组(姓名、年龄、邮箱、技能列表),用 foreach 遍历并以表格形式展示。对技能列表(又是一个数组)做特殊处理——用"、"号分隔输出。
  3. 写一个函数 safeGet($arr, $key, $default),安全地从数组中取指定键的值,如果键不存在则返回默认值。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏