PHP数组操作完全指南:从入门到精通
数组是PHP中最重要的数据结构之一,也是初学者经常感到困惑的地方。作为一名有多年PHP开发经验的程序员,我想分享一些关于PHP数组的实用知识和技巧。
数组的创建方式
1. 基本创建方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php
$fruits1 = array("苹果", "香蕉", "橙子");
$fruits2 = ["苹果", "香蕉", "橙子"];
$fruits3 = []; $fruits3[0] = "苹果"; $fruits3[1] = "香蕉"; $fruits3[2] = "橙子";
$fruits4 = []; $fruits4[] = "苹果"; $fruits4[] = "香蕉"; $fruits4[] = "橙子"; ?>
|
2. 关联数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?php
$person = [ "name" => "张三", "age" => 25, "city" => "北京", "email" => "zhangsan@example.com" ];
$person["phone"] = "13800138000"; $person["job"] = "程序员";
print_r($person); ?>
|
3. 多维数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?php
$students = [ ["name" => "小明", "age" => 20, "score" => 85], ["name" => "小红", "age" => 19, "score" => 92], ["name" => "小刚", "age" => 21, "score" => 78] ];
$school = [ "classes" => [ "class1" => [ ["name" => "学生1", "score" => 85], ["name" => "学生2", "score" => 90] ], "class2" => [ ["name" => "学生3", "score" => 88], ["name" => "学生4", "score" => 95] ] ] ];
echo "第一个学生的姓名:" . $students[0]["name"] . "\n"; echo "class1第一个学生的成绩:" . $school["classes"]["class1"][0]["score"] . "\n"; ?>
|
数组遍历方法
1. foreach循环(推荐)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php $colors = ["红色", "绿色", "蓝色"];
foreach ($colors as $color) { echo "颜色:$color\n"; }
$person = ["name" => "李四", "age" => 30, "city" => "上海"]; foreach ($person as $key => $value) { echo "$key: $value\n"; } ?>
|
2. for循环
1 2 3 4 5 6 7 8
| <?php $numbers = [1, 2, 3, 4, 5];
for ($i = 0; $i < count($numbers); $i++) { echo "索引$i: " . $numbers[$i] . "\n"; } ?>
|
3. while循环配合each()
1 2 3 4 5 6 7 8 9 10
| <?php $data = ["a" => 1, "b" => 2, "c" => 3];
reset($data); while (list($key, $value) = each($data)) { echo "$key => $value\n"; } ?>
|
常用数组函数
1. 数组信息获取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?php $fruits = ["苹果", "香蕉", "橙子", "葡萄"];
echo "数组长度:" . count($fruits) . "\n"; echo "数组长度:" . sizeof($fruits) . "\n";
if (is_array($fruits)) { echo "这是一个数组\n"; }
$person = ["name" => "王五", "age" => 28]; if (array_key_exists("name", $person)) { echo "name键存在\n"; }
if (in_array("苹果", $fruits)) { echo "数组中包含苹果\n"; } ?>
|
2. 数组添加和删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <?php $stack = ["a", "b", "c"];
array_push($stack, "d", "e");
$stack[] = "f";
echo "添加后:"; print_r($stack);
$last = array_pop($stack); echo "删除的元素:$last\n";
array_unshift($stack, "0");
$first = array_shift($stack); echo "删除的第一个元素:$first\n";
print_r($stack); ?>
|
3. 数组搜索和过滤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?php $numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$key = array_search(5, $numbers); echo "值5的键是:$key\n";
$evenNumbers = array_filter($numbers, function($n) { return $n % 2 == 0; }); echo "偶数:"; print_r($evenNumbers);
$squared = array_map(function($n) { return $n * $n; }, $numbers); echo "平方数:"; print_r($squared); ?>
|
4. 数组排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <?php $fruits = ["香蕉", "苹果", "橙子", "葡萄"]; $scores = ["张三" => 85, "李四" => 92, "王五" => 78, "赵六" => 96];
sort($fruits); echo "按值升序排序:"; print_r($fruits);
asort($scores); echo "按分数升序排序:"; print_r($scores);
ksort($scores); echo "按姓名排序:"; print_r($scores);
$students = [ ["name" => "小明", "score" => 85], ["name" => "小红", "score" => 92], ["name" => "小刚", "score" => 78] ];
usort($students, function($a, $b) { return $b["score"] - $a["score"]; });
echo "按分数降序排序:"; print_r($students); ?>
|
5. 数组合并和分割
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <?php $array1 = ["a", "b", "c"]; $array2 = ["d", "e", "f"]; $array3 = ["name" => "张三", "age" => 25]; $array4 = ["city" => "北京", "job" => "程序员"];
$merged1 = array_merge($array1, $array2); print_r($merged1);
$merged2 = array_merge($array3, $array4); print_r($merged2);
$merged3 = $array3 + $array4; print_r($merged3);
$chunk = array_chunk($merged1, 2); echo "分割后的数组:"; print_r($chunk);
$slice = array_slice($merged1, 1, 3); echo "提取的部分:"; print_r($slice); ?>
|
实用技巧和最佳实践
1. 数组去重
1 2 3 4 5 6 7 8 9 10 11
| <?php $numbers = [1, 2, 2, 3, 3, 3, 4, 5];
$unique = array_unique($numbers); print_r($unique);
$reindexed = array_values($unique); print_r($reindexed); ?>
|
2. 数组键值互换
1 2 3 4 5 6 7
| <?php $original = ["a" => 1, "b" => 2, "c" => 3];
$flipped = array_flip($original); print_r($flipped); ?>
|
3. 多维数组排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php $products = [ ["name" => "笔记本", "price" => 5000, "stock" => 10], ["name" => "手机", "price" => 3000, "stock" => 25], ["name" => "平板", "price" => 2000, "stock" => 15] ];
array_multisort( array_column($products, 'price'), SORT_DESC, $products );
echo "按价格降序排序:"; print_r($products); ?>
|
4. 数组转字符串
1 2 3 4 5 6 7 8 9 10 11
| <?php $fruits = ["苹果", "香蕉", "橙子"];
$string = implode(", ", $fruits); echo "水果列表:$string\n";
$newArray = explode(", ", $string); print_r($newArray); ?>
|
5. 检查数组是否为空
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php $emptyArray = []; $nullArray = null; $falseArray = false;
if (empty($emptyArray)) { echo "数组为空\n"; }
if (is_array($emptyArray) && count($emptyArray) == 0) { echo "这是一个空数组\n"; }
if (is_null($nullArray)) { echo "变量为null\n"; } ?>
|
常见错误和陷阱
1. 数组索引问题
1 2 3 4 5 6 7 8 9 10
| <?php $array = [1, 2, 3]; unset($array[1]);
print_r($array);
$reindexed = array_values($array); print_r($reindexed); ?>
|
2. 引用传递陷阱
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php $array = [1, 2, 3, 4, 5];
foreach ($array as &$value) { $value *= 2; }
foreach ($array as $value) { }
print_r($array);
unset($value); ?>
|
3. 数组比较
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php $array1 = [1, 2, 3]; $array2 = ["1", "2", "3"];
if ($array1 == $array2) { echo "使用==比较:相等\n"; }
if ($array1 === $array2) { echo "使用===比较:相等\n"; } else { echo "使用===比较:不相等\n"; } ?>
|
性能优化建议
1. 避免在循环中使用count()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php $largeArray = range(1, 10000);
for ($i = 0; $i < count($largeArray); $i++) { }
$length = count($largeArray); for ($i = 0; $i < $length; $i++) { }
foreach ($largeArray as $value) { } ?>
|
2. 合理使用isset()和array_key_exists()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?php $array = ["key" => null];
if (isset($array["key"])) { echo "键存在且不为null\n"; } else { echo "键不存在或为null\n"; }
if (array_key_exists("key", $array)) { echo "键存在\n"; } ?>
|
总结
PHP数组是一个功能强大的数据结构,掌握以下要点:
- 熟练使用各种创建方式,推荐使用短数组语法[]
- 掌握常用的数组函数,如array_map、array_filter、array_merge等
- 理解索引数组和关联数组的区别
- 注意数组的引用传递陷阱
- 合理选择遍历方式,foreach通常是最佳选择
- 注意性能优化,避免不必要的函数调用
- 理解数组的内部机制,PHP数组实际上是有序映射
通过大量练习和实际项目应用,你会发现PHP数组的强大之处。记住,好的代码不仅要功能正确,还要易读、高效。
希望这篇文章能帮助你更好地掌握PHP数组操作!