前面几节课我们把PHP数组的类型、创建、遍历都讲清楚了。但项目开发里,光会存和取还不够——你经常需要对数组做各种处理:查某个值在不在、往头尾添加元素、截取一部分、翻转顺序、统计数量、排序、合并等等。如果这些都靠自己写循环实现,代码量会很大,而且容易出错。
PHP提供了一套丰富的数组函数,涵盖了数组操作的大部分常见需求。这些函数由PHP内核用C语言实现,执行效率通常比自己手写循环高,而且经过大量用户验证,行为稳定可预期。掌握这些函数能让你在处理数组时事半功倍。
下面挑选日常开发中使用频率较高的十多个数组函数逐一讲解,其余的以速查表形式列出,方便你后续查阅。
一、数组的创建与基础判断
1. array()——创建数组
这是PHP里基础的数组函数,用来创建索引数组、关联数组或多维数组。
<?php
// 创建索引数组
$seasonList = array("春季", "夏季", "秋季", "冬季");
echo "四季:{$seasonList[0]}、{$seasonList[1]}、{$seasonList[2]}、{$seasonList[3]}";
?>
输出:四季:春季、夏季、秋季、冬季
PHP 5.4之后也可以用[]短语法替代array(),两者功能一样,[]写起来更简洁。
2. in_array()——检查值是否存在于数组中
这个函数用来判断某个值是否在数组里,返回布尔值true或false。它的第三个参数$strict是可选的,设为true时会同时检查值的类型。
<?php
$languageSet = ["PHP", "JavaScript", "Python", "Go"];
// 普通检查
var_dump(in_array("PHP", $languageSet)); // bool(true)
var_dump(in_array("Java", $languageSet)); // bool(false)
// 严格模式:类型也必须匹配
$mixedNumbers = [1, "2", 3, 4, 5];
var_dump(in_array(1, $mixedNumbers)); // bool(true)
var_dump(in_array(2, $mixedNumbers, true)); // bool(false),因为数组里是字符串"2",不是整数2
?>
in_array()还能用来检查一个数组是否作为元素存在于另一个数组中。
<?php
$colorGroups = [["绿色", "蓝色"], ["红色", "黄颜色"], "黑色"];
if (in_array(["绿色", "蓝色"], $colorGroups)) {
echo "找到匹配的颜色组!";
}
?>
输出:找到匹配的颜色组!
二、数组元素的增删操作
3. array_push()——向数组末尾追加元素
一次可以追加一个或多个元素,函数返回追加后数组的新长度。
<?php
$memberList = ["张明", "李华", "王芳"];
// 追加单个成员
array_push($memberList, "赵阳");
print_r($memberList);
// 追加多个成员
$fruitBasket = ["苹果", "香蕉", "橘子"];
array_push($fruitBasket, "猕猴桃", "芒果", "葡萄柚");
print_r($fruitBasket);
?>
输出:
Array ([0] => 张明 [1] => 李华 [2] => 王芳 [3] => 赵阳)
Array ([0] => 苹果 [1] => 香蕉 [2] => 橘子 [3] => 猕猴桃 [4] => 芒果 [5] => 葡萄柚)
个人经验分享: 如果你只追加一个元素,用$arr[] = 新值语法比array_push()更简洁,执行上也略快一点(省去了一次函数调用)。array_push()的优势在于一次追加多个元素。
4. array_pop()——从数组末尾移除并返回之后一个元素
<?php
$birdList = ["麻雀", "乌鸦", "鸽子"];
// 弹出之后一个元素
$removedBird = array_pop($birdList);
echo "被移除的鸟类:{$removedBird}<br/>";
print_r($birdList);
?>
输出:
被移除的鸟类:鸽子
Array ([0] => 麻雀 [1] => 乌鸦)
array_pop()直接修改原数组。和array_push()配合,可以把数组当成栈来使用。
5. array_shift()和array_unshift()——在数组头部操作
这两个和pop/push对应,只是操作的是数组的头部。array_shift()移除并返回第一个元素;array_unshift()在数组开头插入一个或多个元素。
<?php
$taskList = ["写文档", "做测试", "开会"];
// 从头部移除
$firstTask = array_shift($taskList);
echo "第一个任务:{$firstTask}<br/>"; // 写文档
// 在头部插入
array_unshift($taskList, "做计划", "晨会");
print_r($taskList);
// Array ([0] => 做计划 [1] => 晨会 [2] => 做测试 [3] => 开会)
?>
三、数组的截取与分块
6. array_slice()——从数组中截取一段
这个函数不会修改原数组,返回截取出的新数组。参数依次是:原数组、起始位置、截取长度(可选)、是否保留原键名(可选)。
<?php
$sportsList = ["篮球", "足球", "棒球", "网球", "游泳", "羽毛球"];
// 从索引2开始截取2个元素,并保留原索引
$pickedSports = array_slice($sportsList, 2, 2, true);
print_r($pickedSports);
?>
输出:
Array ([2] => 棒球 [3] => 网球)
如果省略长度参数,则从起始位置一直截取到数组末尾。
7. array_chunk()——将数组按指定大小分成多个块
返回一个二维数组,每个子数组包含指定数量的元素。适合做分页、分批处理等场景。
<?php
$salaryData = array("张明" => 35000, "李华" => 42000, "王芳" => 28000);
// 每2个元素分一组
$chunked = array_chunk($salaryData, 2);
print_r($chunked);
?>
输出:
Array (
[0] => Array ([0] => 35000 [1] => 42000)
[1] => Array ([0] => 28000)
)
四、数组的排序与翻转
8. sort()——按值升序排列
sort()直接修改原数组,排序后会重新生成数字索引,原来的键名会被丢弃。
<?php
$seasonArr = array("夏季", "冬季", "春季", "秋季");
sort($seasonArr);
foreach ($seasonArr as $s) {
echo "{$s}<br/>";
}
?>
输出按拼音首字母升序排列:春季、冬季、秋季、夏季。
如果排序时需要保留键名,用asort()(按值升序保留键)或ksort()(按键升序)。
9. array_reverse()——翻转数组元素顺序
返回一个顺序相反的新数组。第二个参数设为true可以保留原键名。
<?php
$numberArr = [1, 2, 3, 4, 5];
// 不保留键名
$reversed = array_reverse($numberArr);
print_r($reversed);
// Array ([0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 1)
// 保留原键名
$reversedKeepKeys = array_reverse($numberArr, true);
print_r($reversedKeepKeys);
// Array ([4] => 5 [3] => 4 [2] => 3 [1] => 2 [0] => 1)
?>
五、数组的统计与归并
10. count()——统计数组元素个数
这是使用频率较高的数组函数之一。默认只统计顶层元素数量;传入COUNT_RECURSIVE参数会递归统计所有嵌套元素。
<?php
// 普通统计
$oceanList = ["大西洋", "太平洋", "印度洋", "南冰洋", "北冰洋"];
echo "共有 " . count($oceanList) . " 个大洋<br/>";
// 递归统计多维数组
$animalGroups = [
["猫", "狗", "马"],
["鹦鹉", "鹰", "鸵鸟"],
["金枪鱼", "鲨鱼", "章鱼"],
"老虎"
];
$totalAnimals = count($animalGroups, COUNT_RECURSIVE);
echo "动物总数量:{$totalAnimals}"; // 11
?>
输出:
共有 5 个大洋
动物总数量:11
COUNT_RECURSIVE模式下,有10个数组内元素加上顶层数组本身计为1,结果是11减去1等于10。注意理解它的计数方式:递归模式把子数组本身也计为一个元素。
11. array_reduce()——将数组归并成单个值
通过一个自定义回调函数,把数组元素依次处理,最终聚合成一个结果。常用于求和、求积、字符串拼接等场景。
<?php
// 求和
$valueList = [1, 2, 3, 4, 5];
function addUp($carry, $item) {
return $carry + $item;
}
$totalSum = array_reduce($valueList, 'addUp', 0);
echo "总和:{$totalSum}<br/>"; // 15
// 带初始值的求和
$sumWithInitial = array_reduce($valueList, 'addUp', 10);
echo "初始值10加总和:{$sumWithInitial}<br/>"; // 25
// 字符串拼接
function joinWithDash($carry, $item) {
return $carry . "-" . $item;
}
$petList = ["Dog", "Cat", "Horse"];
$result = array_reduce($petList, "joinWithDash", "起始");
echo $result; // 起始-Dog-Cat-Horse
?>
主观建议: array_reduce()是一个功能比较强大的函数,但回调函数的写法对初学者来说有一定门槛。如果你的归并逻辑很简单(比如就是求和),直接用array_sum()更直接。当归并逻辑比较复杂、不适合用现成函数时,再考虑array_reduce()。
本节课程知识要点
上面讲的十多个函数覆盖了日常数组操作的大部分场景。以下核心点值得记住:
-
创建与判断:
array()创建数组,in_array()检查值是否存在(严格模式用第三个参数)。 -
增删元素:
array_push()尾部追加,array_pop()尾部移除;单个追加用$arr[]更简洁。 -
截取分块:
array_slice()截取一段不修改原数组,array_chunk()把数组分成多个小块。 -
排序翻转:
sort()升序排序(键名会被重置),array_reverse()翻转顺序。 -
统计归并:
count()统计元素个数(递归统计用COUNT_RECURSIVE),array_reduce()用回调函数将数组归并成单个值。
其他常用PHP数组函数速查表
以下函数在日常开发中也经常出现,按需查阅即可:
| 函数名 | 功能简述 |
|---|---|
array_merge() |
合并一个或多个数组,相同键名后面的覆盖前面 |
array_combine() |
用一个数组的值作键,另一个数组的值作值,组合成新数组 |
array_diff() |
计算数组的差集,返回在第一个数组但不在其他数组中的值 |
array_intersect() |
计算数组的交集,返回在所有数组中公共存在的值 |
array_keys() |
返回数组中所有的键名 |
array_values() |
返回数组中所有的值,键名重置为数字索引 |
array_unique() |
移除数组中的重复值 |
array_search() |
在数组中搜索给定值,找到返回对应的键名 |
array_sum() |
对数组中的所有数值求和 |
array_filter() |
用回调函数过滤数组元素 |
array_map() |
将回调函数作用到数组的每个元素上,返回新数组 |
array_rand() |
从数组中随机取出一个或多个键名 |
shuffle() |
随机打乱数组元素顺序 |
range() |
创建一个包含指定范围元素的数组 |
list() |
把数组中的值赋给一组变量 |
extract() |
将关联数组的键值对导入当前符号表成为变量 |
compact() |
将变量名和值组合成关联数组 |
个人经验分享: 在代码号学习编程的过程中,不用刻意去背诵这些函数。我的方法是:遇到数组操作需求时,先想一想“这个操作应该有个现成函数”,然后去查手册。用得多了,count、sort、array_merge、array_keys这几个高频函数会自然内化成肌肉记忆。其余的使用频率相对低一些的函数,知道大概有哪些功能、需要时能检索到就行。
PHP的数组函数体系比较庞大,但不必一次性全部掌握。重点先熟练运用十几个核心函数:array()、in_array()、array_push/pop、array_slice、count()、sort(),这已经能解决大部分日常数组操作需求。随着项目经验的积累,再逐步扩展对其他函数的了解和使用。数组操作熟练了,PHP开发效率会有可见的提升。