数组

学习PHP数组的创建、操作和常用函数

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程序,实现以下功能:

  1. 创建不同类型的数组(索引数组、关联数组、多维数组)
  2. 使用不同方式遍历数组
  3. 实现数组的增删改查操作
  4. 使用数组排序函数对数组排序
  5. 使用数组指针函数操作数组指针
  6. 实现一个简单的学生成绩管理系统
  7. 使用数组过滤和映射函数处理数据
提示: 可以创建一个学生成绩管理系统,使用多维数组存储学生信息,实现添加、删除、查询和排序功能。

学生成绩管理系统示例

学生成绩管理系统
<?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>";
?>