← PHP中的array_diff_ukey():用自定义回调函数比较键名的数组差集(只比键) PHP中的end():将数组指针移到最后一个元素 →

PHP中的each():获取当前元素的键和值并移动指针

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

写这篇文章之前必须先说一句:each()函数从PHP 7.2.0开始被弃用,PHP 8.0.0中已经被移除。

如果你还在用PHP 7.2以下的版本,可以了解它;但如果你的PHP版本是7.2以上,这个函数用不了。官方的替代方案是foreach循环。

不过作为知识了解,还是讲一下这个函数当初是干啥的。

这函数当初是干啥的

each()函数用来获取数组内部指针当前指向的元素的键名和键值,然后自动把指针往前移动一位。它返回一个包含4个元素的数组:

  • [0] 或 [key] → 当前元素的键名

  • [1] 或 [value] → 当前元素的值

注意: 它同时返回数字索引和字符串索引两套信息。这个函数从PHP 4.0就有了,但现在已被移除。

语法格式(仅限PHP 7.2以下)

array each(array &$array): array

参数:

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

返回值: 返回当前元素的键值对数组;指针到达末尾时返回false。

示例1:索引数组的each()返回格式

<?php
// 注意:这段代码只能在PHP 7.2以下运行
$courses = ["PHP基础", "MySQL教程", "JavaScript入门"];
$result = each($courses);
print_r($result);
?>

输出:

Array
(
    [1] => PHP基础
    [value] => PHP基础
    [0] => 0
    [key] => 0
)

返回值同时包含:

  • 数字索引0对应键名0

  • 数字索引1对应键值"PHP基础"

  • 字符串索引"key"对应键名0

  • 字符串索引"value"对应键值"PHP基础"

示例2:遍历数组的老式写法

<?php
// PHP 7.2以下的老式遍历方式
$student_scores = ["张伟" => 85, "李芳" => 92, "王磊" => 78];

reset($student_scores);  // 指针重置到开头

while ($element = each($student_scores)) {
    echo "键名:" . $element['key'] . ",值:" . $element['value'] . "\n";
}
?>

输出:

键名:张伟,值:85
键名:李芳,值:92
键名:王磊,值:78

这种写法在PHP 4和5的时代很常见,但现在已经被foreach彻底替代了。

个人经验分享

  1. 为什么each()被弃用?

    • 性能问题:每次调用返回一个包含4个元素的数组,内存开销大

    • 指针副作用:容易在循环中出bug(比如嵌套循环时指针位置混乱)

    • foreach更简洁、更高效、不容易出错

  2. 如果你的代码里还有each()怎么办?

    • 升级PHP到7.2+时程序会报错

    • 需要手动改成foreach

    改前:

    while (list($key, $value) = each($array)) {
        // 处理
    }

    改后:

    foreach ($array as $key => $value) {
        // 处理
    }
  3. list()配合each()的常见写法

    // 老式写法
    while (list($key, $val) = each($data)) {
        echo "$key => $val";
    }
    
    // 新式写法
    foreach ($data as $key => $val) {
        echo "$key => $val";
    }

示例3:关联数组的each()返回

<?php
// PHP 7.2以下
$product = ["sku" => "KB-001", "name" => "机械键盘", "price" => 299];
$result = each($product);
print_r($result);
?>

输出:

Array
(
    [1] => KB-001
    [value] => KB-001
    [0] => sku
    [key] => sku
)

关联数组中,键名会放到[0][key]里,值放到[1][value]里。

示例4:指针移动的效果

<?php
// PHP 7.2以下
$colors = ["红色", "绿色", "蓝色"];

echo "第一次调用:\n";
print_r(each($colors));  // 拿到第一个元素,指针移到第二个

echo "\n第二次调用:\n";
print_r(each($colors));  // 拿到第二个元素,指针移到第三个

echo "\n第三次调用:\n";
print_r(each($colors));  // 拿到第三个元素,指针移到末尾

echo "\n第四次调用:\n";
var_dump(each($colors));  // 指针已在末尾,返回false
?>

输出:

第一次调用:
Array([1] => 红色 [value] => 红色 [0] => 0 [key] => 0)

第二次调用:
Array([1] => 绿色 [value] => 绿色 [0] => 1 [key] => 1)

第三次调用:
Array([1] => 蓝色 [value] => 蓝色 [0] => 2 [key] => 2)

第四次调用:
bool(false)

现在PHP的正确做法

既然each()已经没了,这里给出当前版本的写法:

<?php
// 现在PHP的写法(PHP 7.2+ / 8.x)
$student_scores = ["代码号001" => 85, "代码号002" => 92, "代码号003" => 78];

// 方式一:foreach(推荐)
foreach ($student_scores as $key => $value) {
    echo "键名:{$key},成绩:{$value}\n";
}

// 方式二:如果要逐个手动控制指针,用current() + key() + next()
reset($student_scores);
while (key($student_scores) !== null) {
    $key = key($student_scores);
    $value = current($student_scores);
    echo "键名:{$key},成绩:{$value}\n";
    next($student_scores);
}
?>

本节课程知识要点

  • each()已在PHP 7.2+被弃用,PHP 8.0+被移除

  • 该函数返回当前元素的键和值,同时移动指针

  • 返回值包含数字索引(0/1)和字符串索引(key/value)

  • 现在PHP中应使用foreach替代

  • 如果必须手动控制指针,用current()key()next()reset()组合

  • 升级旧项目时注意替换所有each()调用

← PHP中的array_diff_ukey():用自定义回调函数比较键名的数组差集(只比键) PHP中的end():将数组指针移到最后一个元素 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号