
each() 函数在早期的 php 版本中常用于遍历数组,它每次返回数组当前元素的键值对,并将内部指针向前移动一位。然而,由于其复杂性、性能开销以及 foreach 循环的出现,each() 函数逐渐变得冗余且易于出错。php 官方决定将其废弃并最终移除,鼓励开发者使用更现代、更高效的数组遍历方式,如 foreach 循环。对于那些需要模拟 each() 行为的特定场景,例如在旧代码迁移或需要精确控制数组内部指针时,自定义替代函数变得尤为重要。
为了替代废弃的 each() 函数,我们可以编写一个自定义函数 myEach(),它接收一个数组引用,模拟 each() 的返回结构和指针移动行为。
以下是一个常见的 myEach() 实现尝试:
function myEach(&$array)
{
    $key = key($array); // 获取当前元素的键
    $result = ($key === null) ? false :
              [$key, current($array), 'key', 'value' => current($array)]; // 尝试构建返回数组
    next($array); // 移动数组内部指针
    return $result;
}这个实现尝试模拟了 each() 的基本逻辑:获取当前键值,构建一个返回数组,然后移动指针。然而,其中构建返回数组的部分存在一个微妙但关键的错误。
原生的 each() 函数返回一个包含四个元素的数组:两个数字索引(0 和 1)和两个字符串索引('key' 和 'value')。其中,0 和 'key' 对应当前元素的键,1 和 'value' 对应当前元素的值。
立即学习“PHP免费学习笔记(深入)”;
让我们回顾一下原始 each() 函数的返回结构: 对于数组 $arr = ['a' => 10, 'b' => 20]; 当 each($arr) 第一次被调用时,它会返回 [0 => 'a', 1 => 10, 'key' => 'a', 'value' => 10]。
对照上述 myEach() 函数的错误实现: [$key, current($array), 'key', 'value' => current($array)]
如果 $key 是 'a',current($array) 是 10,那么这个表达式会生成: ['a', 10, 'key', 'value' => 10]
问题在于第三个元素 'key'。这里它被当作一个字面字符串值放入了数组,而不是将当前元素的键(即 $key 的值)赋给键名为 'key' 的元素。正确的做法应该是将 $key 的值赋给键名为 'key' 的元素。
因此,正确的返回数组结构应该是:
[$key, current($array), 'key' => $key, 'value' => current($array)];
修正后的 myEach() 函数如下:
<?php
/**
 * 模拟 PHP 废弃的 each() 函数行为。
 *
 * @param array $array 数组引用,函数会修改其内部指针。
 * @return array|false 返回当前元素的键值对数组,结构为 [0 => key, 1 => value, 'key' => key, 'value' => value]。
 *                     如果数组指针已超出末尾,则返回 false。
 */
function myEach(&$array)
{
    $key = key($array); // 获取当前元素的键
    // 如果键为 null,表示数组指针已超出末尾,返回 false
    if ($key === null) {
        return false;
    }
    // 构建与 each() 兼容的返回数组结构
    $result = [
        0       => $key,             // 数字索引 0 存储键
        1       => current($array),  // 数字索引 1 存储值
        'key'   => $key,             // 字符串索引 'key' 存储键
        'value' => current($array)   // 字符串索引 'value' 存储值
    ];
    next($array); // 将数组内部指针向前移动一位
    return $result;
}
// 示例用法
$data = [
    'first'  => 'Apple',
    'second' => 'Banana',
    'third'  => 'Cherry'
];
echo "使用 myEach() 函数遍历数组:\n";
while (list($key, $value) = myEach($data)) {
    echo "键: " . $key . ", 值: " . $value . "\n";
}
echo "\n使用 myEach() 函数获取完整返回结构:\n";
reset($data); // 重置数组指针以便再次遍历
$item1 = myEach($data);
echo "第一次调用 myEach():\n";
print_r($item1);
$item2 = myEach($data);
echo "第二次调用 myEach():\n";
print_r($item2);
$item3 = myEach($data);
echo "第三次调用 myEach():\n";
print_r($item3);
$item4 = myEach($data);
echo "第四次调用 myEach() (超出末尾):\n";
var_dump($item4);
?>代码解释:
// 推荐使用 foreach 遍历数组
foreach ($data as $key => $value) {
    echo "键: " . $key . ", 值: " . $value . "\n";
}each() 函数的废弃是 PHP 语言发展的一部分,旨在推动更现代、更高效的编程实践。通过本文,我们不仅理解了 each() 废弃的原因,还掌握了如何编写一个功能完善的 myEach() 函数来替代它,并重点强调了返回数组结构的正确性。虽然自定义替代方案在特定场景下很有用,但开发者应优先考虑使用 foreach 循环等现代 PHP 特性来遍历数组,以确保代码的简洁性、可读性和高性能。
以上就是PHP each() 函数的废弃与自定义替代方案详解的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号