PHP数组操作完全指南:从入门到精通
Orion K Lv6

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
// 方法1:使用array()函数
$fruits1 = array("苹果", "香蕉", "橙子");

// 方法2:使用短数组语法(PHP 5.4+,推荐)
$fruits2 = ["苹果", "香蕉", "橙子"];

// 方法3:逐个赋值
$fruits3 = [];
$fruits3[0] = "苹果";
$fruits3[1] = "香蕉";
$fruits3[2] = "橙子";

// 方法4:自动索引
$fruits4 = [];
$fruits4[] = "苹果"; // 自动分配索引0
$fruits4[] = "香蕉"; // 自动分配索引1
$fruits4[] = "橙子"; // 自动分配索引2
?>

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循环(仅适用于连续数字索引)
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];

// 注意:each()在PHP 7.2中被弃用,PHP 8.0中被移除
// 这里仅作为历史知识展示
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"; // sizeof是count的别名

// 检查是否为数组
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);

// 使用array_map转换数组
$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); // [1 => "a", 2 => "b", 3 => "c"]
?>

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";
}

// 检查是否为null
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]); // 删除索引1

print_r($array); // [0 => 1, 2 => 3]

// 重新索引
$reindexed = array_values($array);
print_r($reindexed); // [0 => 1, 1 => 3]
?>

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中使用引用后没有unset
foreach ($array as &$value) {
$value *= 2;
}
// 忘记unset($value)

// 这会导致意外的结果
foreach ($array as $value) {
// $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++) {
// 每次循环都调用count()
}

// 高效的做法
$length = count($largeArray);
for ($i = 0; $i < $length; $i++) {
// count()只调用一次
}

// 最佳做法:使用foreach
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];

// isset()检查键是否存在且值不为null
if (isset($array["key"])) {
echo "键存在且不为null\n";
} else {
echo "键不存在或为null\n"; // 这个会被执行
}

// array_key_exists()只检查键是否存在
if (array_key_exists("key", $array)) {
echo "键存在\n"; // 这个会被执行
}
?>

总结

PHP数组是一个功能强大的数据结构,掌握以下要点:

  1. 熟练使用各种创建方式,推荐使用短数组语法[]
  2. 掌握常用的数组函数,如array_map、array_filter、array_merge等
  3. 理解索引数组和关联数组的区别
  4. 注意数组的引用传递陷阱
  5. 合理选择遍历方式,foreach通常是最佳选择
  6. 注意性能优化,避免不必要的函数调用
  7. 理解数组的内部机制,PHP数组实际上是有序映射

通过大量练习和实际项目应用,你会发现PHP数组的强大之处。记住,好的代码不仅要功能正确,还要易读、高效。

希望这篇文章能帮助你更好地掌握PHP数组操作!

本站由 提供部署服务