PHP 多维数组
PHP 多维数组中文讲解
什么是 PHP 多维数组?
多维数组是 PHP 中一种包含一个或多个数组的数组,类似于嵌套结构。每个子数组可以包含更多数组,形成多层次的数据结构。多维数组常用于表示复杂数据,如表格、树形结构或数据库查询结果,广泛应用于 Web 开发、数据处理等场景。
为什么使用多维数组?
- 组织复杂数据:适合存储层次结构的数据,如用户信息(姓名、地址、订单等)。
- 灵活性:支持动态嵌套,适应多种数据模型。
- 便于操作:通过循环(如
foreach
)或内置函数(如array_map
)处理嵌套数据。 - 典型场景:处理数据库结果、JSON 数据、配置文件等。
基本语法
多维数组是通过在数组中嵌套数组来定义的。最常见的是二维数组(类似表格),但可以扩展到更多维度。
- 定义多维数组
<?php
$students = [
['name' => 'Alice', 'age' => 20, 'grade' => 'A'],
['name' => 'Bob', 'age' => 22, 'grade' => 'B'],
['name' => 'Charlie', 'age' => 21, 'grade' => 'A']
];
?>
- 访问多维数组
使用多级索引访问元素:
echo $students[0]['name']; // 输出:Alice
echo $students[1]['age']; // 输出:22
- 修改多维数组
直接通过索引修改:
$students[0]['grade'] = 'A+';
echo $students[0]['grade']; // 输出:A+
遍历多维数组
多维数组通常需要嵌套循环来遍历,常见方法包括 foreach
和 for
。
- 使用
foreach
遍历
<?php
foreach ($students as $student) {
echo "姓名: {$student['name']}, 年龄: {$student['age']}, 成绩: {$student['grade']}<br>";
}
?>
输出:
姓名: Alice, 年龄: 20, 成绩: A
姓名: Bob, 年龄: 22, 成绩: B
姓名: Charlie, 年龄: 21, 成绩: A
- 嵌套
foreach
遍历(更复杂结构)
<?php
$class = [
'classA' => [
['name' => 'Alice', 'scores' => [85, 90, 88]],
['name' => 'Bob', 'scores' => [78, 82, 80]]
],
'classB' => [
['name' => 'Charlie', 'scores' => [92, 95, 90]]
]
];
foreach ($class as $className => $students) {
echo "$className:<br>";
foreach ($students as $student) {
echo "姓名: {$student['name']}, 分数: " . implode(', ', $student['scores']) . "<br>";
}
}
?>
输出:
classA:
姓名: Alice, 分数: 85, 90, 88
姓名: Bob, 分数: 78, 82, 80
classB:
姓名: Charlie, 分数: 92, 95, 90
- 使用
for
循环
适合已知维度的数组:
<?php
for ($i = 0; $i < count($students); $i++) {
echo "学生 $i: {$students[$i]['name']}<br>";
}
?>
操作多维数组
PHP 提供多种内置函数处理多维数组:
- 添加元素
$students[] = ['name' => 'David', 'age' => 23, 'grade' => 'C'];
- 删除元素
使用unset()
删除特定元素:
unset($students[1]); // 删除 Bob 的记录
- 排序
使用array_multisort()
或usort()
按特定键排序:
usort($students, function($a, $b) {
return $a['age'] <=> $b['age']; // 按年龄升序排序
});
- 搜索
使用array_column()
提取特定列,结合array_search
:
$names = array_column($students, 'name');
$index = array_search('Alice', $names); // 查找 Alice 的索引
多维数组与表单
多维数组常用于处理复杂表单数据(如多选框或嵌套字段):
<form action="process.php" method="post">
<input type="text" name="user[profile][name]">
<input type="email" name="user[profile][email]">
<input type="submit" value="提交">
</form>
PHP 处理:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$user = $_POST['user'] ?? [];
$name = $user['profile']['name'] ?? '';
$email = $user['profile']['email'] ?? '';
echo "姓名: $name, 邮箱: $email";
}
?>
完整示例:多维数组处理表单
以下是一个处理学生信息的表单,数据存储为多维数组,并保存到数据库。
- HTML 表单 (
students.html
):
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>学生信息</title>
<style>
.error { color: red; }
label { display: inline-block; width: 120px; }
input { margin-bottom: 10px; }
</style>
</head>
<body>
<h2>添加学生</h2>
<form action="process.php" method="post">
<label for="name">姓名*:</label>
<input type="text" id="name" name="student[profile][name]">
<br>
<label for="age">年龄*:</label>
<input type="number" id="age" name="student[profile][age]">
<br>
<label for="math">数学成绩:</label>
<input type="number" id="math" name="student[scores][math]">
<br>
<label for="english">英语成绩:</label>
<input type="number" id="english" name="student[scores][english]">
<br>
<input type="submit" value="提交">
<p>* 表示必需字段</p>
</form>
</body>
</html>
- PHP 处理脚本 (
process.php
):
<?php
// 初始化错误数组
$errors = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 获取多维数组
$student = $_POST['student'] ?? [];
// 清理输入
$name = filter_var($student['profile']['name'] ?? '', FILTER_SANITIZE_STRING);
$age = filter_var($student['profile']['age'] ?? '', FILTER_VALIDATE_INT);
$math = filter_var($student['scores']['math'] ?? '', FILTER_VALIDATE_INT);
$english = filter_var($student['scores']['english'] ?? '', FILTER_VALIDATE_INT);
// 验证必需字段
if (empty($name)) {
$errors[] = "姓名是必需字段";
}
if ($age === false || $age < 1 || $age > 120) {
$errors[] = "年龄必须是 1-120 之间的整数";
}
// 如果没有错误,处理数据
if (empty($errors)) {
// 构建多维数组
$studentData = [
'profile' => [
'name' => $name,
'age' => $age
],
'scores' => [
'math' => $math ?: 0, // 默认值为 0
'english' => $english ?: 0
]
];
// 模拟保存到数据库
try {
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("INSERT INTO students (name, age, math_score, english_score) VALUES (:name, :age, :math, :english)");
$stmt->execute([
'name' => $name,
'age' => $age,
'math' => $math ?: 0,
'english' => $english ?: 0
]);
echo "学生信息保存成功!<br>";
echo "姓名: {$studentData['profile']['name']}, 年龄: {$studentData['profile']['age']}<br>";
echo "数学: {$studentData['scores']['math']}, 英语: {$studentData['scores']['english']}";
} catch (PDOException $e) {
$errors[] = "数据库错误: " . $e->getMessage();
}
}
}
// 显示错误并回显表单
if (!empty($errors)) {
echo "<div class='error'><ul>";
foreach ($errors as $error) {
echo "<li>$error</li>";
}
echo "</ul></div>";
}
include 'students.html';
?>
- 数据库表结构(
students
表):
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
age INT NOT NULL,
math_score INT DEFAULT 0,
english_score INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
关键点解析
- 多维数组结构:表单使用
student[profile][name]
等命名,形成嵌套数组。 - 验证与清理:使用
filter_var()
清理和验证输入,确保数据安全和有效。 - 错误处理:集中存储错误,统一显示,并回显表单。
- 数据库交互:使用 PDO 预处理语句,防止 SQL 注入。
- 安全性:
htmlspecialchars()
防止 XSS,表单字段清理防止恶意输入。
最佳实践
- 明确结构:定义清晰的数组结构,方便访问和维护。
- 循环优化:缓存
count()
结果,避免重复计算:
$count = count($students);
for ($i = 0; $i < $count; $i++) { ... }
- 验证输入:对多维数组的每个字段进行验证和清理。
- 错误提示:提供具体错误信息,如“年龄必须是整数”。
- 使用内置函数:如
array_column
、array_walk
处理多维数组。
参考资源
- PHP 官方手册 – 数组:数组操作函数。
- 菜鸟教程 – PHP 数组:初学者教程。
- OWASP 安全指南:Web 安全最佳实践。
总结
PHP 多维数组是处理复杂数据的强大工具,适合表示嵌套结构如表单数据或数据库结果。通过嵌套循环、数组函数和验证机制,开发者可以高效管理和操作多维数组。结合表单处理和数据库交互,多维数组在 Web 开发中应用广泛,是构建动态应用的关键。