PHP数组概述
数组是一种能够在单个变量中存储多个值的特殊变量,这些值可以是不同的数据类型。
数组类型:
- 索引数组: 使用数字作为键的数组
- 关联数组: 使用字符串作为键的数组
- 多维数组: 包含一个或多个数组的数组
创建数组
PHP提供了多种创建数组的方式。
索引数组
索引数组示例
<?php
// 使用 array() 函数
$fruits1 = array("苹果", "香蕉", "橙子");
// 使用短数组语法 []
$fruits2 = ["苹果", "香蕉", "橙子"];
// 逐个添加元素
$fruits3 = [];
$fruits3[] = "苹果";
$fruits3[] = "香蕉";
$fruits3[] = "橙子";
// 指定索引
$fruits4 = [];
$fruits4[0] = "苹果";
$fruits4[1] = "香蕉";
$fruits4[2] = "橙子";
// 输出数组
print_r($fruits1);
echo "<br>";
var_dump($fruits2);
?>
关联数组
关联数组示例
<?php
// 使用 array() 函数
$person1 = array(
"name" => "张三",
"age" => 25,
"city" => "北京"
);
// 使用短数组语法 []
$person2 = [
"name" => "李四",
"age" => 30,
"city" => "上海"
];
// 逐个添加元素
$person3 = [];
$person3["name"] = "王五";
$person3["age"] = 28;
$person3["city"] = "广州";
// 输出数组
print_r($person1);
echo "<br>";
var_dump($person2);
?>
使用range()函数创建数组
range()函数示例
<?php
// 创建数字范围数组
$numbers = range(1, 10);
print_r($numbers);
// 创建字母范围数组
$letters = range('a', 'z');
print_r($letters);
// 指定步长
$evenNumbers = range(0, 10, 2);
print_r($evenNumbers);
?>
访问数组元素
使用数组键来访问数组中的元素。
访问数组元素示例
<?php
// 索引数组
$fruits = ["苹果", "香蕉", "橙子"];
echo "第一个水果: " . $fruits[0] . "<br>";
echo "第二个水果: " . $fruits[1] . "<br>";
echo "第三个水果: " . $fruits[2] . "<br>";
// 关联数组
$person = [
"name" => "张三",
"age" => 25,
"city" => "北京"
];
echo "姓名: " . $person["name"] . "<br>";
echo "年龄: " . $person["age"] . "<br>";
echo "城市: " . $person["city"] . "<br>";
// 使用变量作为键
$key = "name";
echo "使用变量访问: " . $person[$key] . "<br>";
// 检查元素是否存在
if (isset($person["name"])) {
echo "姓名存在: " . $person["name"] . "<br>";
}
if (!isset($person["email"])) {
echo "邮箱不存在<br>";
}
?>
遍历数组
有多种方式可以遍历数组中的所有元素。
使用 foreach 循环
foreach遍历示例
<?php
$fruits = ["苹果", "香蕉", "橙子"];
// 遍历索引数组(只获取值)
echo "索引数组遍历:<br>";
foreach ($fruits as $fruit) {
echo "水果: $fruit<br>";
}
// 遍历索引数组(获取键和值)
echo "<br>带键的遍历:<br>";
foreach ($fruits as $key => $value) {
echo "键: $key, 值: $value<br>";
}
// 遍历关联数组
$person = [
"name" => "张三",
"age" => 25,
"city" => "北京"
];
echo "<br>关联数组遍历:<br>";
foreach ($person as $key => $value) {
echo "$key: $value<br>";
}
?>
使用 for 循环
for循环遍历示例
<?php
$fruits = ["苹果", "香蕉", "橙子"];
// 使用 for 循环遍历索引数组
$count = count($fruits);
for ($i = 0; $i < $count; $i++) {
echo "水果 $i: $fruits[$i]<br>";
}
// 使用 while 和 each() 遍历(PHP 7.2+ 已弃用)
/*
$fruits = ["苹果", "香蕉", "橙子"];
reset($fruits); // 重置指针到开始
while (list($key, $value) = each($fruits)) {
echo "键: $key, 值: $value<br>";
}
*/
?>
使用数组指针函数遍历
数组指针遍历示例
<?php
$fruits = ["苹果", "香蕉", "橙子"];
// 使用数组指针函数遍历
reset($fruits); // 重置指针到开始
while (current($fruits) !== false) {
echo "当前水果: " . current($fruits) . " (键: " . key($fruits) . ")<br>";
next($fruits);
}
?>
多维数组
多维数组是包含一个或多个数组的数组。
多维数组示例
<?php
// 二维数组
$students = [
["张三", 20, "计算机科学"],
["李四", 22, "数学"],
["王五", 21, "物理学"]
];
echo "学生信息:<br>";
foreach ($students as $student) {
echo "姓名: $student[0], 年龄: $student[1], 专业: $student[2]<br>";
}
// 多维关联数组
$employees = [
"emp1" => [
"name" => "张三",
"age" => 30,
"department" => "技术部"
],
"emp2" => [
"name" => "李四",
"age" => 25,
"department" => "市场部"
],
"emp3" => [
"name" => "王五",
"age" => 28,
"department" => "人力资源部"
]
];
echo "<br>员工信息:<br>";
foreach ($employees as $empId => $employee) {
echo "员工ID: $empId<br>";
echo "- 姓名: " . $employee["name"] . "<br>";
echo "- 年龄: " . $employee["age"] . "<br>";
echo "- 部门: " . $employee["department"] . "<br><br>";
}
// 访问特定元素
echo "第一个员工的姓名: " . $employees["emp1"]["name"] . "<br>";
?>
数组常用函数
PHP提供了大量用于操作数组的函数。
数组操作函数
数组操作函数示例
<?php
$fruits = ["苹果", "香蕉", "橙子"];
// count() - 获取数组元素数量
echo "数组元素数量: " . count($fruits) . "<br>";
// in_array() - 检查元素是否存在
echo "是否存在香蕉: " . (in_array("香蕉", $fruits) ? "是" : "否") . "<br>";
// array_push() - 在数组末尾添加元素
array_push($fruits, "葡萄");
echo "添加后: " . implode(", ", $fruits) . "<br>";
// array_pop() - 删除数组末尾元素
$lastFruit = array_pop($fruits);
echo "删除的元素: $lastFruit<br>";
echo "删除后: " . implode(", ", $fruits) . "<br>";
// array_shift() - 删除数组开头元素
$firstFruit = array_shift($fruits);
echo "删除的元素: $firstFruit<br>";
echo "删除后: " . implode(", ", $fruits) . "<br>";
// array_unshift() - 在数组开头添加元素
array_unshift($fruits, "草莓");
echo "添加后: " . implode(", ", $fruits) . "<br>";
// implode() - 将数组元素连接成字符串
$fruitString = implode(", ", $fruits);
echo "连接字符串: $fruitString<br>";
// explode() - 将字符串分割成数组
$newFruits = explode(", ", $fruitString);
echo "分割后的数组: ";
print_r($newFruits);
echo "<br>";
?>
数组排序函数
数组排序函数示例
<?php
$numbers = [3, 1, 4, 1, 5, 9, 2, 6];
$fruits = ["orange", "apple", "banana"];
$person = [
"name" => "张三",
"age" => 25,
"city" => "北京"
];
// sort() - 对数组升序排序
sort($numbers);
echo "升序排序: " . implode(", ", $numbers) . "<br>";
// rsort() - 对数组降序排序
rsort($numbers);
echo "降序排序: " . implode(", ", $numbers) . "<br>";
// asort() - 根据值对关联数组升序排序
asort($person);
echo "关联数组按值排序: ";
print_r($person);
echo "<br>";
// ksort() - 根据键对关联数组升序排序
ksort($person);
echo "关联数组按键排序: ";
print_r($person);
echo "<br>";
// 对字符串数组排序
sort($fruits);
echo "水果排序: " . implode(", ", $fruits) . "<br>";
?>
数组合并与拆分
数组合并与拆分示例
<?php
$array1 = ["a", "b", "c"];
$array2 = ["d", "e", "f"];
$array3 = ["g", "h", "i"];
// array_merge() - 合并数组
$merged = array_merge($array1, $array2, $array3);
print_r($merged);
// array_slice() - 提取数组的一部分
$slice = array_slice($merged, 2, 3);
print_r($slice);
// array_chunk() - 将数组分割成多个数组
$chunks = array_chunk($merged, 3);
print_r($chunks);
// array_combine() - 创建一个数组,用一个数组的值作为键名,另一个数组的值作为值
$keys = ["name", "age", "city"];
$values = ["张三", 25, "北京"];
$combined = array_combine($keys, $values);
print_r($combined);
?>
数组指针函数
PHP数组有一个内部指针,指向数组中的某个元素。
数组指针函数示例
<?php
$fruits = ["苹果", "香蕉", "橙子", "葡萄"];
// current() - 返回数组中的当前元素
echo "当前元素: " . current($fruits) . "<br>";
// next() - 将数组中的内部指针向前移动一位
next($fruits);
echo "下一个元素: " . current($fruits) . "<br>";
// prev() - 将数组中的内部指针倒回一位
prev($fruits);
echo "上一个元素: " . current($fruits) . "<br>";
// end() - 将数组中的内部指针指向最后一个元素
end($fruits);
echo "最后一个元素: " . current($fruits) . "<br>";
// reset() - 将数组中的内部指针指向第一个元素
reset($fruits);
echo "重置后: " . current($fruits) . "<br>";
// key() - 返回当前元素的键
echo "当前键: " . key($fruits) . "<br>";
?>
数组过滤和映射
PHP提供了一些函数来对数组进行过滤和映射操作。
数组过滤和映射示例
<?php
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// array_filter() - 用回调函数过滤数组中的元素
$evenNumbers = array_filter($numbers, function($value) {
return $value % 2 == 0;
});
print_r($evenNumbers);
// array_map() - 将回调函数作用到给定数组的元素上
$squaredNumbers = array_map(function($value) {
return $value * $value;
}, $numbers);
print_r($squaredNumbers);
// array_reduce() - 用回调函数迭代地将数组简化为单一的值
$sum = array_reduce($numbers, function($carry, $item) {
return $carry + $item;
}, 0);
echo "数组元素总和: $sum<br>";
// array_walk() - 使用用户自定义函数对数组中的每个元素做回调处理
array_walk($numbers, function(&$value, $key) {
$value = "数字 $key: $value";
});
print_r($numbers);
?>
实践练习
创建一个PHP程序,实现以下功能:
- 创建不同类型的数组(索引数组、关联数组、多维数组)
- 使用不同方式遍历数组
- 实现数组的增删改查操作
- 使用数组排序函数对数组排序
- 使用数组指针函数操作数组指针
- 实现一个简单的学生成绩管理系统
- 使用数组过滤和映射函数处理数据
提示: 可以创建一个学生成绩管理系统,使用多维数组存储学生信息,实现添加、删除、查询和排序功能。
学生成绩管理系统示例
学生成绩管理系统
<?php
// 学生成绩数组
$students = [
["id" => 1, "name" => "张三", "math" => 85, "english" => 90, "chinese" => 78],
["id" => 2, "name" => "李四", "math" => 92, "english" => 88, "chinese" => 95],
["id" => 3, "name" => "王五", "math" => 78, "english" => 85, "chinese" => 82],
["id" => 4, "name" => "赵六", "math" => 65, "english" => 72, "chinese" => 68]
];
// 计算每个学生的平均分
foreach ($students as &$student) {
$student["average"] = round(($student["math"] + $student["english"] + $student["chinese"]) / 3, 2);
}
// 按平均分降序排序
usort($students, function($a, $b) {
return $b["average"] - $a["average"];
});
// 显示学生成绩
echo "<h3>学生成绩排名</h3>";
echo "<table border='1'>";
echo "<tr><th>排名</th><th>姓名</th><th>数学</th><th>英语</th><th>语文</th><th>平均分</th></tr>";
foreach ($students as $index => $student) {
echo "<tr>";
echo "<td>" . ($index + 1) . "</td>";
echo "<td>" . $student["name"] . "</td>";
echo "<td>" . $student["math"] . "</td>";
echo "<td>" . $student["english"] . "</td>";
echo "<td>" . $student["chinese"] . "</td>";
echo "<td>" . $student["average"] . "</td>";
echo "</tr>";
}
echo "</table>";
?>