数组是 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():检查键是否存在并且值不为 nullarray_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
在函数返回值中使用:
functiongetUser() { return [ 'name' => '张三', 'email' => 'zhangsan@example.com' ];}['name' => $name, 'email' => $email] = getUser();
总结
今天我们分享了 10 个 PHP 数组的高级用法,这些都是在实际项目中非常实用的技巧:
array_column():快速提取二维数组中的某一列array_filter():过滤数组中的元素array_map():对数组中的每个元素应用回调函数array_merge() vs array_replace():数组合并的区别array_reduce():将数组简化为单个值array_key_exists() vs isset():检查键是否存在的区别array_unique():去除数组中的重复值array_slice():截取数组的一部分array_search():在数组中搜索值
掌握这些技巧,你可以写出更简洁、更高效、更易读的 PHP 代码。建议大家收藏这篇文章,在实际开发中遇到数组处理问题时拿出来参考。
你在 PHP 开发中最常用的数组函数是什么?还有哪些实用的数组技巧想要分享?欢迎在评论区留言讨论!