0%

PHP8 数组相关函数:全面解析与实战应用

PHP8 数组相关函数:全面解析与实战应用

数组是 PHP 中最常用的数据结构之一,用于存储和处理多个值。PHP8 提供了丰富的数组函数,涵盖数组的创建、修改、查询、排序等操作。本文将详细介绍常用的数组函数及其在实际开发中的应用。

数组创建与初始化函数

1. array() 与短数组语法 []

最基础的数组创建方式,[] 是 PHP5.4+ 引入的短语法,推荐使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// 索引数组
$fruits = array("apple", "banana", "cherry");
$vegetables = ["carrot", "potato", "cabbage"];

// 关联数组
$user = array(
"name" => "John",
"age" => 30,
"email" => "john@example.com"
);
$product = [
"id" => 101,
"name" => "Laptop",
"price" => 999.99
];
?>

2. range():创建范围内的数组

快速创建包含指定范围元素的数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// 创建1到10的数组
$numbers = range(1, 10);
print_r($numbers);
// 输出:Array ( [0] => 1 [1] => 2 ... [9] => 10 )

// 创建1到20的偶数数组
$evenNumbers = range(2, 20, 2);
print_r($evenNumbers);
// 输出:Array ( [0] => 2 [1] => 4 ... [9] => 20 )

// 创建字母数组
$letters = range('a', 'e');
print_r($letters);
// 输出:Array ( [0] => a [1] => b [2] => c [3] => d [4] => e )
?>

3. array_fill():填充数组

用指定值填充数组,创建具有指定长度的数组。

1
2
3
4
5
6
7
8
9
10
11
<?php
// 创建包含5个"apple"的数组
$fruits = array_fill(0, 5, "apple");
print_r($fruits);
// 输出:Array ( [0] => apple [1] => apple ... [4] => apple )

// 从索引10开始,创建3个值为0的数组
$scores = array_fill(10, 3, 0);
print_r($scores);
// 输出:Array ( [10] => 0 [11] => 0 [12] => 0 )
?>

数组信息获取函数

1. count()sizeof():计算数组长度

获取数组中元素的数量,sizeof()count() 的别名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$colors = ["red", "green", "blue"];
echo count($colors); // 输出:3

// 多维数组
$users = [
["name" => "John"],
["name" => "Jane"]
];
// 只计算一维
echo count($users); // 输出:2
// 递归计算所有元素
echo count($users, COUNT_RECURSIVE); // 输出:4(2个外层元素+2个内层name元素)
?>

2. isset()empty():检查数组元素

  • isset():检查数组元素是否存在且不为 null
  • empty():检查数组元素是否为空(0、””、null、空数组等都视为空)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$user = [
"name" => "John",
"age" => 0,
"email" => null
];

var_dump(isset($user["name"])); // bool(true)
var_dump(isset($user["email"])); // bool(false)(值为null)
var_dump(isset($user["phone"])); // bool(false)(键不存在)

var_dump(empty($user["age"])); // bool(true)(0视为空)
var_dump(empty($user["name"])); // bool(false)(非空字符串)
?>

3. array_key_exists():检查键是否存在

专门用于检查数组中是否存在指定的键名。

1
2
3
4
5
6
7
8
9
10
11
<?php
$product = ["id" => 101, "name" => "Laptop"];

var_dump(array_key_exists("id", $product)); // bool(true)
var_dump(array_key_exists("price", $product)); // bool(false)

// 与isset()的区别:isset()会认为null值的键不存在
$test = ["key" => null];
var_dump(array_key_exists("key", $test)); // bool(true)
var_dump(isset($test["key"])); // bool(false)
?>

数组元素操作函数

1. array_push()array_pop():数组尾部操作

  • array_push():向数组尾部添加一个或多个元素
  • array_pop():删除并返回数组的最后一个元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$fruits = ["apple", "banana"];

// 添加元素
array_push($fruits, "cherry", "date");
print_r($fruits);
// 输出:Array ( [0] => apple [1] => banana [2] => cherry [3] => date )

// 也可以直接使用[]语法添加
$fruits[] = "elderberry";
print_r($fruits);
// 输出:Array ( [0] => apple ... [4] => elderberry )

// 删除最后一个元素
$last = array_pop($fruits);
echo "删除的元素:{$last}<br>"; // 输出:删除的元素:elderberry
print_r($fruits);
// 输出:Array ( [0] => apple [1] => banana [2] => cherry [3] => date )
?>

2. array_unshift()array_shift():数组头部操作

  • array_unshift():向数组头部添加一个或多个元素
  • array_shift():删除并返回数组的第一个元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$numbers = [3, 4, 5];

// 在头部添加元素
array_unshift($numbers, 1, 2);
print_r($numbers);
// 输出:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )

// 删除第一个元素
$first = array_shift($numbers);
echo "删除的元素:{$first}<br>"; // 输出:删除的元素:1
print_r($numbers);
// 输出:Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 )
?>

3. array_splice():数组片段操作

删除数组的一部分元素,并可以在删除的位置插入新元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$colors = ["red", "green", "blue", "yellow"];

// 从索引1开始,删除2个元素
array_splice($colors, 1, 2);
print_r($colors); // 输出:Array ( [0] => red [1] => yellow )

$numbers = [1, 2, 3, 4, 5];
// 从索引2开始,删除1个元素,并插入新元素
array_splice($numbers, 2, 1, ["a", "b"]);
print_r($numbers); // 输出:Array ( [0] => 1 [1] => 2 [2] => a [3] => b [4] => 4 [5] => 5 )
?>

数组过滤与查找函数

1. array_filter():过滤数组元素

使用回调函数过滤数组中的元素,保留返回 true 的元素。

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];

// 过滤出偶数
$evenNumbers = array_filter($numbers, function($n) {
return $n % 2 == 0;
});
print_r($evenNumbers); // 输出:Array ( [1] => 2 [3] => 4 ... [9] => 10 )

// 过滤出年龄大于18的用户
$users = [
["name" => "John", "age" => 25],
["name" => "Jane", "age" => 17],
["name" => "Bob", "age" => 30]
];
$adults = array_filter($users, function($user) {
return $user["age"] >= 18;
});
print_r($adults);
?>

2. array_search()in_array():查找元素

  • in_array($value, $array):检查数组中是否存在指定值
  • array_search($value, $array):查找值并返回其键名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$fruits = ["apple", "banana", "cherry"];

// 检查值是否存在
var_dump(in_array("banana", $fruits)); // bool(true)
var_dump(in_array("date", $fruits)); // bool(false)

// 查找值并返回键名
$key = array_search("cherry", $fruits);
echo "键名:{$key}"; // 输出:键名:2

// 严格类型检查(第三个参数为true)
$numbers = [1, 2, 3, "4"];
var_dump(in_array(4, $numbers)); // bool(true)(宽松比较)
var_dump(in_array(4, $numbers, true)); // bool(false)(严格比较,类型不同)
?>

3. array_keys()array_values():获取键与值

  • array_keys():返回数组中所有的键名
  • array_values():返回数组中所有的值
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
$user = [
"id" => 101,
"name" => "John",
"age" => 30
];

// 获取所有键名
$keys = array_keys($user);
print_r($keys); // 输出:Array ( [0] => id [1] => name [2] => age )

// 获取所有值
$values = array_values($user);
print_r($values); // 输出:Array ( [0] => 101 [1] => John [2] => 30 )

// 筛选特定值的键名
$products = [
"apple" => "fruit",
"carrot" => "vegetable",
"banana" => "fruit"
];
$fruitKeys = array_keys($products, "fruit");
print_r($fruitKeys); // 输出:Array ( [0] => apple [1] => banana )
?>

数组排序函数

PHP 提供了多种排序函数,适用于不同的排序需求:

函数 说明 保持键值关联
sort() 按值升序排序 否(重置索引)
rsort() 按值降序排序
asort() 按值升序排序
arsort() 按值降序排序
ksort() 按键名升序排序
krsort() 按键名降序排序
usort() 使用自定义函数排序
uasort() 使用自定义函数排序
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
34
<?php
// 索引数组排序
$numbers = [3, 1, 4, 1, 5, 9];
sort($numbers);
print_r($numbers); // 输出:Array ( [0] => 1 [1] => 1 [2] => 3 [3] => 4 [4] => 5 [5] => 9 )

// 关联数组按值排序(保持键值关联)
$scores = [
"John" => 85,
"Jane" => 92,
"Bob" => 78
];
asort($scores); // 升序
print_r($scores);
// 输出:Array ( [Bob] => 78 [John] => 85 [Jane] => 92 )

// 按键名排序
ksort($scores);
print_r($scores);
// 输出:Array ( [Bob] => 78 [Jane] => 92 [John] => 85 )

// 自定义排序(按年龄排序)
$people = [
["name" => "John", "age" => 30],
["name" => "Jane", "age" => 25],
["name" => "Bob", "age" => 35]
];
usort($people, function($a, $b) {
return $a["age"] - $b["age"];
});
print_r($people);
// 输出按年龄升序排列的数组
?>

数组合并与拆分函数

1. array_merge():合并数组

将一个或多个数组合并为一个数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$array1 = ["a", "b", "c"];
$array2 = ["d", "e", "f"];
$merged = array_merge($array1, $array2);
print_r($merged);
// 输出:Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f )

// 合并关联数组
$user1 = ["name" => "John", "age" => 30];
$user2 = ["age" => 31, "email" => "john@example.com"];
$user = array_merge($user1, $user2);
print_r($user);
// 输出:Array ( [name] => John [age] => 31 [email] => john@example.com )
// 注意:相同键名的值会被后面的数组覆盖
?>

2. array_chunk():拆分数组

将一个数组拆分为多个指定长度的子数组。

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
<?php
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];

// 拆分为每个数组包含3个元素
$chunks = array_chunk($numbers, 3);
print_r($chunks);
/*
输出:
Array (
[0] => Array ( [0] => 1 [1] => 2 [2] => 3 )
[1] => Array ( [0] => 4 [1] => 5 [2] => 6 )
[2] => Array ( [0] => 7 [1] => 8 [2] => 9 )
)
*/

// 保留原始键名
$user = [
"name" => "John",
"age" => 30,
"email" => "john@example.com",
"city" => "New York"
];
$userChunks = array_chunk($user, 2, true);
print_r($userChunks);
// 保留键名的拆分结果
//Array(
//[0] => Array([name] => John [age] => 30)
//[1] => Array([email] => john@example.com [city] => New York)
//)
?>

PHP8 数组相关新特性

1. 数组解包增强

PHP8 允许在数组表达式中使用 ... 解包多个数组。

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$array1 = [1, 2, 3];
$array2 = [4, 5, 6];

// 合并数组
$combined = [...$array1, ...$array2];
print_r($combined); // 输出:Array ( [0] => 1 [1] => 2 ... [5] => 6 )

// 在新数组中插入
$newArray = [0, ...$array1, 7, 8];
print_r($newArray); // 输出:Array ( [0] => 0 [1] => 1 ... [4] => 3 [5] => 7 [6] => 8 )
?>

2. array_is_list()(PHP8.1+)

判断一个数组是否为 “列表”(索引从 0 开始的连续整数)。

1
2
3
4
5
<?php
var_dump(array_is_list(["a", "b", "c"])); // bool(true)
var_dump(array_is_list(["a", 1 => "b", "c"])); // bool(true)(连续递增,0 → 1 → 2,无跳跃,所以是list)
var_dump(array_is_list(["name" => "John", "age" => 30])); // bool(false)(关联数组)
?>

3. array_key_first()array_key_last()(PHP7.3+)

获取数组的第一个和最后一个键名,比传统方法更高效。

1
2
3
4
5
6
7
8
9
<?php
$fruits = ["apple", "banana", "cherry"];
echo array_key_first($fruits); // 输出:0
echo array_key_last($fruits); // 输出:2

$user = ["name" => "John", "age" => 30, "email" => "john@example.com"];
echo array_key_first($user); // 输出:name
echo array_key_last($user); // 输出:email
?>

数组函数最佳实践

  1. 优先使用短数组语法[]array() 更简洁易读
  2. 注意数组类型:区分索引数组和关联数组,选择合适的函数
  3. 处理大型数组时注意性能:某些函数(如 array_merge())会创建新数组,大型数组可能消耗较多内存
  4. 使用严格比较:在 in_array()array_search() 中使用第三个参数 true 进行严格类型检查
  5. 多维数组处理:复杂的多维数组操作可考虑使用递归或专门的数组迭代器
  6. 空数组判断:使用 empty()count($array) === 0 判断数组是否为空
  7. 避免修改正在迭代的数组:在 foreach 循环中修改数组可能导致意外结果

欢迎关注我的其它发布渠道