PHP数组
数组是PHP中一种非常重要的数据结构,用于存储多个值。PHP支持三种类型的数组:索引数组(带有数字索引)、关联数组(带有命名键)和多维数组(包含一个或多个数组的数组)。本教程将详细介绍PHP数组的定义、操作和常用函数。
PHP数组的定义
在PHP中,有多种方式定义数组:
1. 使用array()函数
<?php
// 索引数组
$cars = array("Volvo", "BMW", "Toyota");
// 关联数组
$age = array("Peter" => 35, "Ben" => 37, "Joe" => 43);
?>
2. 使用方括号语法(PHP 5.4+)
<?php
// 索引数组
$cars = ["Volvo", "BMW", "Toyota"];
// 关联数组
$age = ["Peter" => 35, "Ben" => 37, "Joe" => 43];
?>
3. 逐个添加元素
<?php
// 索引数组
$cars[0] = "Volvo";
$cars[1] = "BMW";
$cars[2] = "Toyota";
// 关联数组
$age["Peter"] = 35;
$age["Ben"] = 37;
$age["Joe"] = 43;
?>
PHP索引数组
索引数组是使用数字作为键的数组。PHP会自动为索引数组分配数字索引,索引从0开始。
<?php
// 创建索引数组
$colors = array("Red", "Green", "Blue");
// 访问索引数组元素
echo $colors[0]; // 输出: Red
echo $colors[1]; // 输出: Green
echo $colors[2]; // 输出: Blue
// 遍历索引数组
for ($i = 0; $i < count($colors); $i++) {
echo $colors[$i] . "<br>";
}
// 使用foreach遍历索引数组
foreach ($colors as $color) {
echo $color . "<br>";
}
?>
PHP关联数组
关联数组是使用命名键的数组,可以为每个元素指定一个有意义的键名。
<?php
// 创建关联数组
$student = array(
"name" => "John Doe",
"age" => 25,
"email" => "john@example.com",
"course" => "Computer Science"
);
// 访问关联数组元素
echo $student["name"]; // 输出: John Doe
echo $student["age"]; // 输出: 25
echo $student["email"]; // 输出: john@example.com
// 遍历关联数组
foreach ($student as $key => $value) {
echo "$key: $value<br>";
}
?>
PHP多维数组
多维数组是包含一个或多个数组的数组。PHP支持二维、三维和更高维的数组。
1. 二维数组
<?php
// 创建二维数组(学生信息列表)
$students = array(
array("name" => "John", "age" => 22, "grade" => "A"),
array("name" => "Mary", "age" => 21, "grade" => "B"),
array("name" => "Peter", "age" => 23, "grade" => "C")
);
// 访问二维数组元素
echo $students[0]["name"]; // 输出: John
echo $students[1]["age"]; // 输出: 21
echo $students[2]["grade"]; // 输出: C
// 遍历二维数组
for ($i = 0; $i < count($students); $i++) {
echo "学生 " . ($i + 1) . " 信息:<br>";
foreach ($students[$i] as $key => $value) {
echo "$key: $value<br>";
}
echo "<br>";
}
?>
2. 三维数组
<?php
// 创建三维数组(学生成绩表)
$grades = array(
"class1" => array(
"John" => array("math" => 85, "english" => 92, "science" => 78),
"Mary" => array("math" => 90, "english" => 88, "science" => 95)
),
"class2" => array(
"Peter" => array("math" => 75, "english" => 80, "science" => 85),
"Lisa" => array("math" => 92, "english" => 94, "science" => 88)
)
);
// 访问三维数组元素
echo $grades["class1"]["John"]["math"]; // 输出: 85
echo $grades["class2"]["Lisa"]["english"]; // 输出: 94
// 遍历三维数组
foreach ($grades as $class => $students) {
echo "$class 成绩表:<br>";
foreach ($students as $student => $scores) {
echo "$student 的成绩:<br>";
foreach ($scores as $subject => $score) {
echo "$subject: $score<br>";
}
echo "<br>";
}
echo "<br>";
}
?>
PHP数组操作
PHP提供了丰富的数组操作函数,可以方便地添加、删除、修改和查询数组元素。
1. 添加元素
<?php
// 索引数组添加元素
$colors = array("Red", "Green");
$colors[] = "Blue"; // 添加到数组末尾
$colors[3] = "Yellow"; // 指定索引位置添加
// 关联数组添加元素
$person = array("name" => "John", "age" => 25);
$person["email"] = "john@example.com";
$person["address"] = "123 Main St";
?>
2. 修改元素
<?php
// 修改索引数组元素
$colors = array("Red", "Green", "Blue");
$colors[1] = "Light Green";
// 修改关联数组元素
$person = array("name" => "John", "age" => 25);
$person["age"] = 26;
?>
3. 删除元素
<?php
// 删除索引数组元素
$colors = array("Red", "Green", "Blue");
unset($colors[1]); // 删除索引为1的元素
// 删除关联数组元素
$person = array("name" => "John", "age" => 25, "email" => "john@example.com");
unset($person["email"]);
// 删除所有数组元素
$colors = array("Red", "Green", "Blue");
unset($colors); // 删除整个数组
?>
4. 合并数组
<?php
// 合并两个索引数组
$colors1 = array("Red", "Green");
$colors2 = array("Blue", "Yellow");
$merged_colors = array_merge($colors1, $colors2);
// 合并两个关联数组
$person1 = array("name" => "John", "age" => 25);
$person2 = array("email" => "john@example.com", "address" => "123 Main St");
$merged_person = array_merge($person1, $person2);
// 合并有相同键的关联数组
$array1 = array("a" => "red", "b" => "green");
$array2 = array("b" => "blue", "c" => "yellow");
$merged_array = array_merge($array1, $array2); // 结果: array("a" => "red", "b" => "blue", "c" => "yellow")
?>
5. 数组长度
<?php
$colors = array("Red", "Green", "Blue");
$length = count($colors); // 获取数组长度,结果: 3
?>
6. 数组排序
<?php
// 索引数组排序
$numbers = array(4, 2, 8, 6, 1);
sort($numbers); // 升序排序,结果: array(1, 2, 4, 6, 8)
rsort($numbers); // 降序排序,结果: array(8, 6, 4, 2, 1)
// 关联数组按键排序
$ages = array("Peter" => 35, "Ben" => 37, "Joe" => 43);
ksort($ages); // 按键升序排序,结果: array("Ben" => 37, "Joe" => 43, "Peter" => 35)
krsort($ages); // 按键降序排序,结果: array("Peter" => 35, "Joe" => 43, "Ben" => 37)
// 关联数组按值排序
$ages = array("Peter" => 35, "Ben" => 37, "Joe" => 43);
asort($ages); // 按值升序排序,结果: array("Peter" => 35, "Ben" => 37, "Joe" => 43)
arsort($ages); // 按值降序排序,结果: array("Joe" => 43, "Ben" => 37, "Peter" => 35)
?>
PHP数组函数
PHP提供了大量的数组函数,可以用于各种数组操作。以下是一些常用的数组函数:
函数 | 描述 |
---|---|
array() | 创建数组 |
array_change_key_case() | 将数组中的所有键更改为大写或小写 |
array_chunk() | 将数组分割成多个数组 |
array_column() | 从多维数组中返回单列 |
array_combine() | 通过合并两个数组来创建一个新数组 |
array_count_values() | 统计数组中所有值出现的次数 |
array_diff() | 计算数组的差集 |
array_diff_assoc() | 使用键名和键值比较计算数组的差集 |
array_diff_key() | 使用键名比较计算数组的差集 |
array_diff_uassoc() | 带用户自定义函数的键名和键值比较 |
array_diff_ukey() | 带用户自定义函数的键名比较 |
array_fill() | 用给定的值填充数组 |
array_fill_keys() | 用指定的键和值填充数组 |
array_filter() | 用回调函数过滤数组中的元素 |
array_flip() | 交换数组中的键和值 |
array_intersect() | 计算数组的交集 |
array_intersect_assoc() | 使用键名和键值比较计算数组的交集 |
array_intersect_key() | 使用键名比较计算数组的交集 |
array_intersect_uassoc() | 带用户自定义函数的键名和键值比较 |
array_intersect_ukey() | 带用户自定义函数的键名比较 |
array_key_exists() | 检查数组中是否存在指定的键 |
array_keys() | 返回数组中所有的键 |
array_map() | 将回调函数作用到数组中的每个元素上 |
array_merge() | 合并一个或多个数组 |
array_merge_recursive() | 递归地合并一个或多个数组 |
array_multisort() | 对多个数组或多维数组进行排序 |
array_pad() | 用值将数组填补到指定长度 |
array_pop() | 删除数组中的最后一个元素 |
array_product() | 计算数组中所有值的乘积 |
array_push() | 将一个或多个元素压入数组的末尾 |
array_rand() | 从数组中随机选出一个或多个键 |
array_reduce() | 用回调函数迭代地将数组简化为单个值 |
array_replace() | 用后面数组的值替换第一个数组的值 |
array_replace_recursive() | 递归地用后面数组的值替换第一个数组的值 |
array_reverse() | 将数组中的元素顺序反转 |
array_search() | 在数组中搜索给定的值,如果找到则返回键名 |
array_shift() | 删除并返回数组中的第一个元素 |
array_slice() | 从数组中取出一段 |
array_splice() | 删除数组中的一部分元素,并可以用新元素替代它们 |
array_sum() | 计算数组中所有值的和 |
array_udiff() | 用回调函数比较数据来计算数组的差集 |
array_udiff_assoc() | 带索引检查的数组差集,用回调函数比较数据 |
array_udiff_uassoc() | 带索引检查的数组差集,用回调函数比较数据和索引 |
array_uintersect() | 计算数组的交集,用回调函数比较数据 |
array_uintersect_assoc() | 带索引检查的数组交集,用回调函数比较数据 |
array_uintersect_uassoc() | 带索引检查的数组交集,用回调函数比较数据和索引 |
array_unique() | 移除数组中的重复值 |
array_unshift() | 在数组的开头插入一个或多个元素 |
array_values() | 返回数组中所有的值 |
array_walk() | 对数组中的每个元素应用用户自定义函数 |
array_walk_recursive() | 递归地对数组中的每个元素应用用户自定义函数 |
arsort() | 对关联数组按照键值进行降序排序 |
asort() | 对关联数组按照键值进行升序排序 |
compact() | 创建一个包含变量名和它们的值的数组 |
count() | 计算数组中的元素数目 |
current() | 返回数组中的当前元素 |
each() | 返回数组中当前的键/值对并将数组指针向前移动一步 |
end() | 将数组的内部指针指向最后一个元素 |
extract() | 从数组中将变量导入到当前的符号表 |
in_array() | 检查数组中是否存在某个值 |
key() | 从关联数组中取得键名 |
krsort() | 对关联数组按照键名进行降序排序 |
ksort() | 对关联数组按照键名进行升序排序 |
list() | 把数组中的值赋给一组变量 |
natcasesort() | 用自然排序算法对数组进行不区分大小写的排序 |
natsort() | 用自然排序算法对数组排序 |
next() | 将数组中的内部指针向前移动一位 |
prev() | 将数组中的内部指针倒回一位 |
range() | 创建一个包含指定范围的元素的数组 |
reset() | 将数组的内部指针指向第一个元素 |
rsort() | 对索引数组按照值进行降序排序 |
shuffle() | 打乱数组 |
sizeof() | count()的别名 |
sort() | 对索引数组按照值进行升序排序 |
uasort() | 使用用户自定义的比较函数对数组进行排序并保持索引关联 |
uksort() | 使用用户自定义的比较函数对数组按照键名排序 |
usort() | 使用用户自定义的比较函数对数组进行排序 |
PHP数组的最佳实践
- 选择合适的数组类型:根据需要存储的数据类型和访问方式,选择索引数组或关联数组。
- 使用方括号语法:在PHP 5.4及以上版本中,使用方括号语法($array = [1, 2, 3];)来定义数组,更加简洁易读。
- 使用有意义的键名:在关联数组中,使用有意义的键名可以提高代码的可读性和可维护性。
- 避免过深的多维数组:尽量避免使用过深的多维数组,这会使代码难以理解和维护。
- 使用数组函数:PHP提供了丰富的数组函数,合理使用这些函数可以简化代码并提高效率。
- 检查数组元素是否存在:在访问数组元素之前,使用array_key_exists()或isset()函数检查元素是否存在,以避免产生警告。
- 使用foreach循环遍历数组:foreach循环是遍历数组的最简洁和最高效的方式。
- 使用类型声明:在PHP 7及以上版本中,可以使用类型声明来确保数组的类型安全。
PHP数组综合示例
<?php
// 1. 索引数组示例
echo "<h4>1. 索引数组示例</h4>";
// 创建索引数组
$languages = array("PHP", "JavaScript", "Python", "Java", "C++");
// 访问数组元素
echo "第一个编程语言: " . $languages[0] . "<br>";
echo "第二个编程语言: " . $languages[1] . "<br>";
// 修改数组元素
$languages[2] = "Ruby";
echo "修改后的第三个编程语言: " . $languages[2] . "<br>";
// 添加新元素
$languages[] = "Go";
echo "数组的新长度: " . count($languages) . "<br>";
echo "最后添加的编程语言: " . end($languages) . "<br>";
// 遍历数组
echo "<h5>所有编程语言:</h5>";
foreach ($languages as $language) {
echo $language . "<br>";
}
echo "<br><br>";
// 2. 关联数组示例
echo "<h4>2. 关联数组示例</h4>";
// 创建关联数组
$book = array(
"title" => "PHP Programming",
"author" => "John Smith",
"publisher" => "Tech Books",
"year" => 2020,
"price" => 49.99
);
// 访问数组元素
echo "书名: " . $book["title"] . "<br>";
echo "作者: " . $book["author"] . "<br>";
echo "价格: $" . $book["price"] . "<br>";
// 修改数组元素
$book["price"] = 39.99;
echo "修改后的价格: $" . $book["price"] . "<br>";
// 添加新元素
$book["rating"] = 4.5;
echo "添加的评分: " . $book["rating"] . "<br>";
// 遍历关联数组
echo "<h5>图书信息:</h5>";
foreach ($book as $key => $value) {
echo "$key: $value<br>";
}
echo "<br><br>";
// 3. 多维数组示例
echo "<h4>3. 多维数组示例</h4>";
// 创建二维数组
$employees = array(
array("id" => 1, "name" => "John Doe", "department" => "HR", "salary" => 50000),
array("id" => 2, "name" => "Jane Smith", "department" => "IT", "salary" => 60000),
array("id" => 3, "name" => "Mike Johnson", "department" => "Finance", "salary" => 55000),
array("id" => 4, "name" => "Lisa Davis", "department" => "Marketing", "salary" => 48000)
);
// 访问多维数组元素
echo "第一个员工姓名: " . $employees[0]["name"] . "<br>";
echo "第三个员工部门: " . $employees[2]["department"] . "<br>";
// 遍历二维数组
echo "<h5>员工信息表:</h5>";
echo "<table border='1' cellspacing='0' cellpadding='5'>";
echo "<tr><th>ID</th><th>姓名</th><th>部门</th><th>薪资</th></tr>";
foreach ($employees as $employee) {
echo "<tr>";
echo "<td>" . $employee["id"] . "</td>";
echo "<td>" . $employee["name"] . "</td>";
echo "<td>" . $employee["department"] . "</td>";
echo "<td>$" . $employee["salary"] . "</td>";
echo "</tr>";
}
echo "</table>";
echo "<br><br>";
// 4. 数组函数示例
echo "<h4>4. 数组函数示例</h4>";
// 数组排序
$numbers = array(5, 2, 8, 1, 9, 3);
echo "原始数组: " . implode(", ", $numbers) . "<br>";
sort($numbers);
echo "升序排序: " . implode(", ", $numbers) . "<br>";
rsort($numbers);
echo "降序排序: " . implode(", ", $numbers) . "<br>";
echo "<br>";
// 数组搜索
$fruits = array("apple", "banana", "orange", "grape", "mango");
$search_fruit = "orange";
if (in_array($search_fruit, $fruits)) {
echo "$search_fruit 在数组中,索引为: " . array_search($search_fruit, $fruits) . "<br>";
} else {
echo "$search_fruit 不在数组中";
}
echo "<br>";
// 数组过滤
$ages = array(18, 25, 30, 16, 14, 21, 40);
$adult_ages = array_filter($ages, function($age) {
return $age >= 18;
});
echo "所有年龄: " . implode(", ", $ages) . "<br>";
echo "成年人年龄: " . implode(", ", $adult_ages) . "<br>";
echo "<br>";
// 数组合并
$array1 = array("a", "b", "c");
$array2 = array("d", "e", "f");
$merged_array = array_merge($array1, $array2);
echo "数组1: " . implode(", ", $array1) . "<br>";
echo "数组2: " . implode(", ", $array2) . "<br>";
echo "合并后的数组: " . implode(", ", $merged_array) . "<br>";
echo "<br>";
// 数组映射
$numbers = array(1, 2, 3, 4, 5);
$squared_numbers = array_map(function($number) {
return $number * $number;
}, $numbers);
echo "原始数组: " . implode(", ", $numbers) . "<br>";
echo "平方后的数组: " . implode(", ", $squared_numbers) . "<br>";
echo "<br><br>";
// 5. 实际应用示例
echo "<h4>5. 实际应用示例</h4>";
// 示例1: 统计单词频率
function count_words($text) {
// 转换为小写并替换非字母数字字符
$text = strtolower($text);
$text = preg_replace('/[^a-z0-9 ]/', '', $text);
// 拆分为单词数组
$words = explode(' ', $text);
// 移除空元素
$words = array_filter($words);
// 统计频率
$word_counts = array_count_values($words);
// 按频率排序
arsort($word_counts);
return $word_counts;
}
// 测试单词频率统计
$text = "PHP is a popular general-purpose scripting language that is especially suited to web development. PHP is known for its simplicity and flexibility. PHP can be embedded into HTML.";
$word_counts = count_words($text);
// 显示结果
echo "<h5>单词频率统计:</h5>";
foreach ($word_counts as $word => $count) {
echo "$word: $count 次<br>";
}
echo "<br>";
// 示例2: 计算数组的统计信息
function array_stats($array) {
$stats = array();
$stats["count"] = count($array);
$stats["sum"] = array_sum($array);
$stats["average"] = $stats["sum"] / $stats["count"];
$stats["min"] = min($array);
$stats["max"] = max($array);
// 排序数组以计算中位数
sort($array);
$middle = floor($stats["count"] / 2);
if ($stats["count"] % 2 == 0) {
$stats["median"] = ($array[$middle-1] + $array[$middle]) / 2;
} else {
$stats["median"] = $array[$middle];
}
// 计算众数
$values = array_count_values($array);
$max_count = max($values);
$modes = array_keys($values, $max_count);
$stats["mode"] = $modes[0];
return $stats;
}
// 测试数组统计信息
$scores = array(85, 92, 78, 90, 85, 95, 88, 90, 85, 92);
$stats = array_stats($scores);
// 显示结果
echo "<h5>数组统计信息:</h5>";
echo "数组元素: " . implode(", ", $scores) . "<br>";
echo "元素数量: " . $stats["count"] . "<br>";
echo "总和: " . $stats["sum"] . "<br>";
echo "平均值: " . $stats["average"] . "<br>";
echo "最小值: " . $stats["min"] . "<br>";
echo "最大值: " . $stats["max"] . "<br>";
echo "中位数: " . $stats["median"] . "<br>";
echo "众数: " . $stats["mode"] . "<br>";
echo "<br>";
// 示例3: 构建导航菜单
function build_nav_menu($items) {
$menu = "<ul>\n";
foreach ($items as $key => $item) {
$menu .= " <li>\n";
if (is_array($item)) {
// 有子菜单
$menu .= " <a href='#'>$key</a>\n";
$menu .= " <ul>\n";
foreach ($item as $sub_key => $sub_item) {
$menu .= " <li><a href='{$sub_item}'>$sub_key</a></li>\n";
}
$menu .= " </ul>\n";
} else {
// 无子菜单
$menu .= " <a href='{$item}'>$key</a>\n";
}
$menu .= " </li>\n";
}
$menu .= "</ul>";
return $menu;
}
// 测试导航菜单构建
$nav_items = array(
"首页" => "index.html",
"产品" => array(
"智能手机" => "products/smartphones.html",
"笔记本电脑" => "products/laptops.html",
"平板电脑" => "products/tablets.html"
),
"关于我们" => "about.html",
"联系我们" => "contact.html"
);
// 显示导航菜单
echo "<h5>导航菜单示例:</h5>";
echo build_nav_menu($nav_items);
// 示例4: 处理表单数据
function process_form_data($form_data) {
// 过滤和清理表单数据
$clean_data = array();
foreach ($form_data as $key => $value) {
// 移除首尾空白字符
$clean_value = trim($value);
// 转义特殊字符
$clean_value = htmlspecialchars($clean_value);
// 存储清理后的数据
$clean_data[$key] = $clean_value;
}
return $clean_data;
}
// 测试表单数据处理(模拟表单数据)
$form_data = array(
"name" => " John Doe ",
"email" => "john@example.com",
"message" => "Hello, this is a test message! <script>alert('XSS')</script>"
);
$clean_data = process_form_data($form_data);
// 显示结果
echo "<br><h5>表单数据处理:</h5>";
echo "原始数据:<br>";
echo "<pre>". print_r($form_data, true) ."</pre><br>";
echo "清理后的数据:<br>";
echo "<pre>". print_r($clean_data, true) ."</pre><br>";
// 示例5: 构建查询字符串
function build_query_string($params) {
$query_string = "";
$first = true;
foreach ($params as $key => $value) {
if ($first) {
$query_string .= "?";
$first = false;
} else {
$query_string .= "&";
}
$query_string .= urlencode($key) . "=" . urlencode($value);
}
return $query_string;
}
// 测试查询字符串构建
$query_params = array(
"page" => 1,
"sort" => "name",
"order" => "asc",
"search" => "PHP教程"
);
$query_string = build_query_string($query_params);
echo "<h5>查询字符串示例:</h5>";
echo "查询参数: <pre>". print_r($query_params, true) ."</pre><br>";
echo "生成的查询字符串: " . $query_string . "<br><br>";
?>