← PHP中的each():获取当前元素的键和值并移动指针 PHP中的extract():把数组元素变成独立变量 →

PHP中的end():将数组指针移到最后一个元素

原创 2026-05-22 PHP 已有人查阅

PHP数组内部有个指针,指向当前正在处理的元素。end()函数就是把这个指针直接移动到数组的之后一个元素,并返回那个元素的值。

它和reset()是相反的操作——reset()移到第一个,end()移到之后一个。这个函数从PHP 4.0就有了。

语法格式

mixed end(array &$array): mixed

参数说明:

参数 说明 必填?
array 要操作的数组(传引用,指针会被移动) 必填

返回值:

  • 成功时返回之后一个元素的值

  • 空数组时返回false

注意点

返回值false有两种可能:

  1. 数组是空的

  2. 之后一个元素的值本身就是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,这是个更可靠的判断方式。

个人经验分享

  1. 和reset()搭配使用的常见场景

    $data = [10, 20, 30, 40, 50];
    $first = reset($data);
    $last = end($data);
    echo "第一个:{$first},之后一个:{$last}";

    同时取首尾元素。

  2. 获取之后一个元素的键名

    // 方法一: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(),不需要移动指针就能拿到之后一个键名。

  3. 性能方面
    end()只移动指针,不复制数组,时间复杂度是O(1)。即使是大数组也很快。

  4. 注意事项

    • 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开始可用

← PHP中的each():获取当前元素的键和值并移动指针 PHP中的extract():把数组元素变成独立变量 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号