首页
学习
活动
专区
圈层
工具
发布

PHP 数组的 10 个高级用法,让你的代码更简洁高效

  数组是 PHP 中最常用的数据结构之一,几乎每个 PHP 项目都会大量使用数组。很多开发者只会用最基础的foreach循环和[]语法来操作数组,但 PHP 其实提供了非常丰富的数组处理函数。

  掌握这些高级用法,不仅能让你的代码更简洁、更易读,还能显著提升开发效率和程序性能。今天我们就来分享 10 个在实际项目中最常用的 PHP 数组高级技巧,看完就能直接用到你的项目中。

1. array_column ():快速提取二维数组中的某一列

适用场景:从数据库查询结果中提取 ID 列表、名称列表等。

传统写法(繁琐且容易出错):

$users = [   ['id' => 1, 'name' => '张三', 'email' => 'zhangsan@example.com'],   ['id' => 2, 'name' => '李四', 'email' => 'lisi@example.com'],   ['id' => 3, 'name' => '王五', 'email' => 'wangwu@example.com'],];$userNames = [];foreach ($users as $user) {   $userNames[] = $user['name'];}// 输出:['张三', '李四', '王五']print_r($userNames);

高级写法(一行代码搞定):

$userNames = array_column($users, 'name');// 还可以指定索引列$userMap = array_column($users, 'name', 'id');// 输出:[1 => '张三', 2 => '李四', 3 => '王五']print_r($userMap);

优点:代码量减少 70%,可读性大大提高,性能也比手动循环更好。

2. array_filter ():过滤数组中的元素

适用场景:根据条件筛选数组元素,比如过滤掉空值、筛选出符合条件的数据。

示例 1:过滤数组中的空值

$data = ['apple', '', 'banana', null, 'orange', false, 'grape'];// 自动过滤掉所有空值、null、false和0$filteredData = array_filter($data);// 输出:['apple', 'banana', 'orange', 'grape']print_r($filteredData);

示例 2:自定义过滤条件

$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];// 筛选出偶数$evenNumbers = array_filter($numbers, function($num) {   return $num % 2 === 0;});// 输出:[2, 4, 6, 8, 10]print_r($evenNumbers);

注意:array_filter()会保留原数组的键名,如果需要重新索引,可以用array_values()函数:

$evenNumbers = array_values(array_filter($numbers, function($num) {   return $num % 2 === 0;}));

3. array_map ():对数组中的每个元素应用回调函数

适用场景:批量处理数组元素,比如统一转换大小写、格式化数据等。

示例:将数组中的所有字符串转换为大写

$fruits = ['apple', 'banana', 'orange', 'grape'];$upperFruits = array_map('strtoupper', $fruits);// 输出:['APPLE', 'BANANA', 'ORANGE', 'GRAPE']print_r($upperFruits);

示例:处理二维数组

$users = [   ['id' => 1, 'name' => '张三', 'age' => 25],   ['id' => 2, 'name' => '李四', 'age' => 30],   ['id' => 3, 'name' => '王五', 'age' => 35],];// 给每个用户的年龄加1$updatedUsers = array_map(function($user) {   $user['age'] += 1;   return $user;}, $users);print_r($updatedUsers);

4. array_merge () vs array_replace ():数组合并的区别

很多开发者容易混淆这两个函数,它们的行为有很大不同:

array_merge()

索引数组:追加合并,重新索引

关联数组:相同键名,后面的值覆盖前面的值

array_replace()

索引数组和关联数组:相同键名,后面的值都覆盖前面的值

示例对比

$array1 = ['a', 'b', 'c'];$array2 = ['d', 'e', 'f'];// 索引数组合并print_r(array_merge($array1, $array2)); // 输出:['a', 'b', 'c', 'd', 'e', 'f']print_r(array_replace($array1, $array2)); // 输出:['d', 'e', 'f']$array3 = ['a' => 1, 'b' => 2];$array4 = ['b' => 3, 'c' => 4];// 关联数组合并print_r(array_merge($array3, $array4)); // 输出:['a' => 1, 'b' => 3, 'c' => 4]print_r(array_replace($array3, $array4)); // 输出:['a' => 1, 'b' => 3, 'c' => 4]

结论:合并索引数组用array_merge(),替换数组元素用array_replace()。5. array_reduce ():将数组简化为单个值

适用场景:计算数组总和、乘积,或者将数组拼接成字符串等。

示例:计算数组总和

$numbers = [1, 2, 3, 4, 5];$sum = array_reduce($numbers, function($carry, $item) {   return $carry + $item;}, 0);// 输出:15echo $sum;

示例:将数组拼接成字符串

$words = ['Hello', 'World', 'PHP'];$sentence = array_reduce($words, function($carry, $item) {   return $carry . ' ' . $item;}, '');// 输出:Hello World PHPecho trim($sentence);

6. array_key_exists () vs isset ():检查键是否存在的区别

这是 PHP 中最容易踩坑的地方之一:

isset():检查键是否存在并且值不为 null

array_key_exists():只检查键是否存在,不管值是什么

示例对比

$data = ['a' => 1, 'b' => null, 'c' => false];var_dump(isset($data['a'])); // bool(true)var_dump(isset($data['b'])); // bool(false)var_dump(isset($data['c'])); // bool(true)var_dump(isset($data['d'])); // bool(false)var_dump(array_key_exists('a', $data)); // bool(true)var_dump(array_key_exists('b', $data)); // bool(true)var_dump(array_key_exists('c', $data)); // bool(true)var_dump(array_key_exists('d', $data)); // bool(false)

最佳实践:

如果你确定值不会为 null,用isset()(性能更好)

如果你需要检查键是否真的存在,不管值是什么,用array_key_exists()

7. array_unique ():去除数组中的重复值

适用场景:去除数组中的重复元素。

$numbers = [1, 2, 2, 3, 3, 3, 4, 5, 5];$uniqueNumbers = array_unique($numbers);// 输出:[1, 2, 3, 4, 5]print_r(array_values($uniqueNumbers));

注意

array_unique()会保留第一个出现的元素

它会将元素转换为字符串进行比较,所以对于对象数组不适用

对于大型数组,性能可能不太好,可以考虑先排序再去重

8. array_slice ():截取数组的一部分

适用场景:分页、获取数组的前 N 个元素、获取数组的后 N 个元素等。

$fruits = ['apple', 'banana', 'orange', 'grape', 'mango'];// 获取前3个元素$firstThree = array_slice($fruits, 0, 3);// 输出:['apple', 'banana', 'orange']print_r($firstThree);// 获取从第2个元素开始的所有元素$fromSecond = array_slice($fruits, 2);// 输出:['orange', 'grape', 'mango']print_r($fromSecond);// 获取最后2个元素$lastTwo = array_slice($fruits, -2);// 输出:['grape', 'mango']print_r($lastTwo);

优点:array_slice()不会修改原数组,这一点和array_splice()不同。9. array_search ():在数组中搜索值

适用场景:查找某个值在数组中的键名。

$fruits = ['apple', 'banana', 'orange', 'grape'];$key = array_search('banana', $fruits);// 输出:1echo $key;// 严格比较(推荐)$key = array_search('banana', $fruits, true);

注意:一定要加上第三个参数true进行严格比较,否则可能会出现意想不到的结果:

$data = [0, 1, 2, '3'];// 不加严格比较,会返回0(因为'abc' == 0)var_dump(array_search('abc', $data)); // int(0)// 加上严格比较,返回falsevar_dump(array_search('abc', $data, true)); // bool(false)

10. 数组解构赋值(PHP 7.1+)

适用场景:快速将数组中的值赋给多个变量。

基础用法

[$a, $b, $c] = [1, 2, 3];echo $a; // 1echo $b; // 2echo $c; // 3

跳过某些元素:

[,, $c] = [1, 2, 3];echo $c; // 3

关联数组解构(PHP 7.1+):

['name' => $name, 'email' => $email] = [   'name' => '张三',   'email' => 'zhangsan@example.com',   'age' => 25];echo $name; // 张三echo $email; // zhangsan@example.com

在函数返回值中使用

function getUser() {   return [       'name' => '张三',       'email' => 'zhangsan@example.com'   ];}['name' => $name, 'email' => $email] = getUser();

总结

今天我们分享了 10 个 PHP 数组的高级用法,这些都是在实际项目中非常实用的技巧:

array_column():快速提取二维数组中的某一列

array_filter():过滤数组中的元素

array_map():对数组中的每个元素应用回调函数

array_merge() vsarray_replace():数组合并的区别

array_reduce():将数组简化为单个值

array_key_exists() vsisset():检查键是否存在的区别

array_unique():去除数组中的重复值

array_slice():截取数组的一部分

array_search():在数组中搜索值

数组解构赋值:快速将数组中的值赋给多个变量

  掌握这些技巧,你可以写出更简洁、更高效、更易读的 PHP 代码。建议大家收藏这篇文章,在实际开发中遇到数组处理问题时拿出来参考。

你在 PHP 开发中最常用的数组函数是什么?还有哪些实用的数组技巧想要分享?欢迎在评论区留言讨论!

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O3QhpBvT_vcBY_L4DK6nIFsg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。
领券