PHP数组内部有个指针,指向当前正在处理的元素。end()函数就是把这个指针直接移动到数组的之后一个元素,并返回那个元素的值。
它和reset()是相反的操作——reset()移到第一个,end()移到之后一个。这个函数从PHP 4.0就有了。
语法格式
mixed end(array &$array): mixed
参数说明:
| 参数 | 说明 | 必填? |
|---|---|---|
| array | 要操作的数组(传引用,指针会被移动) | 必填 |
返回值:
-
成功时返回之后一个元素的值
-
空数组时返回false
注意点
返回值false有两种可能:
-
数组是空的
-
之后一个元素的值本身就是false
没法通过返回值区分这两种情况。可以用!empty($array)先判断数组是否为空。
示例1:基础用法
<?php
$scores = [85, 92, 78, 88, 96];
$last_score = end($scores);
echo "之后一个成绩:{$last_score}\n";
// 查看当前指针位置
echo "当前指针指向的值:" . current($scores) . "\n";
?>
输出:
之后一个成绩:96
当前指针指向的值:96
调用end()之后,指针就停在之后一个元素了,所以current()也返回96。
示例2:关联数组
<?php
$student = [
"name" => "代码号001",
"age" => 20,
"score" => 87,
"grade" => "B"
];
$last_value = end($student);
echo "之后一个元素的值:{$last_value}\n";
// 同时可以获取之后一个元素的键名
$last_key = key($student);
echo "之后一个元素的键名:{$last_key}\n";
?>
输出:
之后一个元素的值:B
之后一个元素的键名:grade
end()只返回值,配合key()可以拿到键名。
示例3:空数组的处理
<?php
$empty = [];
$result = end($empty);
var_dump($result);
// 判断数组是否为空
if (empty($empty)) {
echo "数组是空的\n";
}
?>
输出:
bool(false)
数组是空的
空数组返回false,不会有报错或警告。
示例4:之后一个元素的值恰好是false
<?php
$data = ["success", false, 100];
$result = end($data);
var_dump($result);
// 无法区分是空数组还是值为false
// 更好的做法:
$last_key = key($data);
if ($last_key === null) {
echo "数组是空的\n";
} else {
echo "之后一个值:";
var_dump($result);
}
?>
输出:
bool(false)
之后一个值:bool(false)
key()在空数组时返回null,这是个更可靠的判断方式。
个人经验分享
-
和reset()搭配使用的常见场景
$data = [10, 20, 30, 40, 50]; $first = reset($data); $last = end($data); echo "第一个:{$first},之后一个:{$last}";同时取首尾元素。
-
获取之后一个元素的键名
// 方法一:end()后调key() end($array); $last_key = key($array); $last_value = current($array); // 方法二:用array_key_last()(PHP 7.3+) $last_key = array_key_last($array); $last_value = $array[$last_key];PHP 7.3引入了
array_key_last()和array_key_first(),不需要移动指针就能拿到之后一个键名。 -
性能方面
end()只移动指针,不复制数组,时间复杂度是O(1)。即使是大数组也很快。 -
注意事项
-
end()会改变数组的内部指针。如果后续代码依赖指针位置,记得用reset()重置或者提前备份 -
对空数组调用
end()返回false,不会报错 -
end()对对象的行为取决于对象是否实现了ArrayAccess接口,通常情况下直接传对象会有警告
-
示例5:end()在循环中的特殊用法
<?php
$queue = ["任务1", "任务2", "任务3", "任务4"];
// 从后往前处理(类似栈)
while (!empty($queue)) {
$last = end($queue);
echo "处理:{$last}\n";
array_pop($queue); // 移除之后一个
}
// 注意:上面用end()其实多余,array_pop()本身就会返回之后一个元素
// 更好的写法:
$queue2 = ["任务A", "任务B", "任务C"];
while ($task = array_pop($queue2)) {
echo "处理:{$task}\n";
}
?>
输出:
处理:任务4
处理:任务3
处理:任务2
处理:任务1
处理:任务C
处理:任务B
处理:任务A
示例6:代码号学习编程场景
<?php
// 场景:成绩管理系统,需要获取较高分和较低分
$exam_scores = [
"代码号001" => 85,
"代码号002" => 92,
"代码号003" => 78,
"代码号004" => 88,
"代码号005" => 96
];
// 按成绩排序
asort($exam_scores); // 升序
$lowest_score_student = key($exam_scores);
$lowest_score = reset($exam_scores);
$highest_score_student = key($exam_scores);
$highest_score = end($exam_scores);
echo "较低分:{$lowest_score_student} 得分 {$lowest_score}\n";
echo "较高分:{$highest_score_student} 得分 {$highest_score}\n";
?>
输出:
较低分:代码号003 得分 78
较高分:代码号005 得分 96
示例7:end()与prev()配合从后往前遍历
<?php
$items = ["键盘", "鼠标", "显示器", "耳机", "摄像头"];
echo "从后往前遍历:\n";
end($items); // 移到之后一个
while ($item = current($items)) {
echo "- {$item}\n";
prev($items); // 往前移
}
?>
输出:
从后往前遍历:
- 摄像头
- 耳机
- 显示器
- 鼠标
- 键盘
本节课程知识要点
-
end()将数组内部指针移动到之后一个元素 -
返回之后一个元素的值,空数组返回false
-
会修改原数组的指针位置
-
配合
key()可获取之后一个元素的键名 -
配合
prev()可从后往前遍历数组 -
PHP 7.3+可用
array_key_last()直接获取之后一个键名而不移动指针 -
从PHP 4.0开始可用