PHP数组内部有一个指针,指向当前正在处理的元素。current()函数就是用来获取这个指针当前位置的值。
数组就像一个带游标的列表,游标停在哪,current()就取出哪儿的元素。这个函数从PHP 4.0就有了。
语法格式
mixed current(array $array): mixed
参数说明:
| 参数 | 说明 | 必填? |
|---|---|---|
| array | 要操作的数组 | 必填 |
返回值: 返回当前指针位置的值。如果指针指向了数组末尾(没有更多元素),返回false。
注意
current()返回false有两种可能:
-
当前元素的值本身就是false
-
指针已经移到了数组末尾
没法通过返回值区分这两种情况。所以检查空数组要结合其他方法。
相关的指针操作函数
| 函数 | 作用 |
|---|---|
| current() | 获取当前元素的值 |
| key() | 获取当前元素的键名 |
| next() | 指针向前移动一位 |
| prev() | 指针向后移动一位 |
| reset() | 指针重置到第一个元素 |
| end() | 指针移到之后一个元素 |
| each() | 返回当前键值对并移动指针(PHP 7.2+已废弃) |
示例1:获取当前元素(默认指向第一个)
<?php
$langs = ["PHP", "JavaScript", "Python", "Java", "Go"];
$current_val = current($langs);
echo "当前元素:{$current_val}\n";
?>
输出:
当前元素:PHP
新创建的数组,指针默认指向第一个元素(下标0)。
示例2:配合next()移动指针
<?php
$courses = ["PHP基础", "MySQL教程", "JavaScript入门", "Laravel框架", "Vue实战"];
print_r(current($courses)); // 第一个:PHP基础
next($courses);
print_r(current($courses)); // 第二个:MySQL教程
next($courses);
print_r(current($courses)); // 第三个:JavaScript入门
?>
输出:
PHP基础
MySQL教程
JavaScript入门
每调用一次next(),指针往前移一位。current()就能拿到新位置的值。
示例3:指针移到之后再往前
<?php
$scores = [85, 92, 78, 88, 96];
// 先移到之后一个
end($scores);
echo "之后一个:" . current($scores) . "\n";
// 往前移一位
prev($scores);
echo "倒数第二个:" . current($scores) . "\n";
// 重置到开头
reset($scores);
echo "第一个:" . current($scores) . "\n";
?>
输出:
之后一个:96
倒数第二个:88
第一个:85
end()移到末尾,prev()往后退。reset()一键回到起点。
示例4:遍历数组的另一种方式
<?php
$student_scores = [
"代码号001" => 87,
"代码号002" => 92,
"代码号003" => 78,
"代码号004" => 95
];
// 用while + current + next遍历
reset($student_scores); // 确保从头开始
while ($score = current($student_scores)) {
$key = key($student_scores);
echo "{$key} 的成绩是:{$score}\n";
next($student_scores);
}
?>
输出:
代码号001 的成绩是:87
代码号002 的成绩是:92
代码号003 的成绩是:78
代码号004 的成绩是:95
这种遍历方式和foreach比各有利弊。foreach更方便,但这种方式可以控制遍历的步进逻辑(比如跳过一个、走两步退一步之类的)。
个人经验分享
-
foreach更适合大多数场景
日常开发里,99%的情况用foreach就够了。current()/next()这套是PHP早期的数组遍历方式,现在用得少了。但它们在某些特殊场景下还有用武之地:-
需要手动控制指针移动步数
-
多个数组之间的同步遍历
-
需要处理嵌套的复杂遍历逻辑
-
-
区分current()和key()
-
current()拿的是值
-
key()拿的是键名
经常搭配使用。
-
-
注意false的
$arr = [false, true, false]; reset($arr); while ($val = current($arr)) { // 这个循环不会执行,因为第一个值就是false echo $val; next($arr); }如果数组包含false、0、空字符串这些“假值”,用current()做循环条件会提前终止。解决方案:
while ($val = current($arr) !== false) { // 明确检查 !== false } // 或者用 foreach 省心 -
遍历结束后current()返回false
$arr = [1,2,3]; reset($arr); next($arr); next($arr); next($arr); // 已经到末尾了 var_dump(current($arr)); // bool(false)
示例5:手动同步遍历两个数组
<?php
$names = ["张伟", "李芳", "王磊", "赵敏"];
$scores = [87, 92, 78, 88];
reset($names);
reset($scores);
while (($name = current($names)) !== false && ($score = current($scores)) !== false) {
echo "{$name}:{$score}分\n";
next($names);
next($scores);
}
?>
输出:
张伟:87分
李芳:92分
王磊:78分
赵敏:88分
两个不同数组需要同时遍历时,用这套手动指针的方式挺方便的。foreach没法同时遍历两个数组,除非用array_map()。
示例6:指针的独立性
<?php
$data = ["a", "b", "c", "d"];
// 每个数组都有自己独立的内部指针
$ref1 = $data;
$ref2 = $data;
echo "ref1:";
echo current($ref1) . " ";
next($ref1);
echo current($ref1) . " ";
echo "\nref2:";
echo current($ref2) . " "; // 还是第一个
?>
输出:
ref1:a b
ref2:a
注意:复制一个数组时,新数组的指针是独立的,互不影响。
本节课程知识要点
-
current()返回数组内部指针当前位置的值 -
新数组的指针默认指向第一个元素
-
配合
next()、prev()、reset()、end()移动指针 -
返回值false可能是数组末尾,也可能是元素值本身就是false
-
目前
foreach比这套手动指针更常用,但特定场景下仍有价值 -
current()的别名是pos(),功能一样 -
从PHP 4.0开始可用