
在php 7.2版本中,each() 函数被正式废弃,并在php 8.0版本中彻底移除。each() 函数的主要作用是返回数组当前指针位置的键值对,并将数组的内部指针向前移动一位。它返回一个包含四个元素的数组:键的数字索引(0)、值的数字索引(1)、键的字符串索引('key')和值的字符串索引('value')。这种混合的返回格式在现代php编程中显得冗余且容易引起混淆,且其内部指针操作也常与foreach等更简洁的迭代方式冲突。
由于each() 函数的废弃,依赖它的旧代码将无法在PHP新版本中运行,因此寻找一个合适的替代方案至关重要。
为了兼容旧代码逻辑或在特定场景下模拟 each() 的行为,一些开发者会尝试实现自己的 myEach() 函数。一个常见的尝试性实现如下:
function myEach(&$array)
{
$key = key($array);
$result = ($key === null) ? false :
[$key, current($array), 'key', 'value' => current($array)];
next($array);
return $result;
}这段代码尝试模拟 each() 的行为,通过 key() 获取当前键,current() 获取当前值,并通过 next() 移动内部指针。然而,在返回结果的数组构造中,存在一个明显的错误:
[$key, current($array), 'key', 'value' => current($array)];
问题出在 'key' 这个元素上。原始的 each() 函数在返回数组中,会有一个 'key' 字符串索引,其值是实际的键。但上述代码中,'key' 被直接作为一个字符串字面量放进了数组,而不是作为键名来引用变量 $key。这意味着,这个数组的第三个元素将是一个字符串 'key',而不是 key => $key 这样的键值对。这与 each() 的预期行为不符,会导致获取键时出错。
立即学习“PHP免费学习笔记(深入)”;
要正确模拟 each() 函数的返回结构,我们需要确保数组的第三个元素是 key => $key 形式的键值对。修正后的 myEach() 函数如下:
function myEach(&$array)
{
$key = key($array); // 获取当前元素的键
// 如果键为null,表示数组已遍历完毕或为空,返回 false
if ($key === null) {
return false;
}
$value = current($array); // 获取当前元素的值
// 构建模拟 each() 返回的数组结构
$result = [
0 => $key, // 数字索引0,值为键
1 => $value, // 数字索引1,值为值
'key' => $key, // 字符串索引'key',值为键
'value' => $value // 字符串索引'value',值为值
];
next($array); // 将数组的内部指针向前移动一位
return $result;
}代码解析:
您可以像使用 each() 函数一样,在 while 循环中使用 myEach() 来迭代数组:
$data = [
'first' => 'apple',
'second' => 'banana',
'third' => 'orange'
];
// 使用 myEach() 迭代数组
reset($data); // 确保内部指针在数组开头
while (($entry = myEach($data)) !== false) {
echo "键 (数字索引): " . $entry[0] . ", 值 (数字索引): " . $entry[1] . "\n";
echo "键 (字符串索引): " . $entry['key'] . ", 值 (字符串索引): " . $entry['value'] . "\n";
echo "--------------------\n";
}
echo "\n";
$numbers = [10, 20, 30];
reset($numbers);
while (($entry = myEach($numbers)) !== false) {
echo "键: " . $entry['key'] . ", 值: " . $entry['value'] . "\n";
}输出示例:
键 (数字索引): first, 值 (数字索引): apple 键 (字符串索引): first, 值 (字符串索引): apple -------------------- 键 (数字索引): second, 值 (数字索引): banana 键 (字符串索引): second, 值 (字符串索引): banana -------------------- 键 (数字索引): third, 值 (数字索引): orange 键 (字符串索引): third, 值 (字符串索引): orange -------------------- 键: 0, 值: 10 键: 1, 值: 20 键: 2, 值: 30
尽管自定义 myEach() 可以模拟 each() 的行为,但在大多数情况下,PHP提供了更优、更现代的数组迭代方式:
foreach 循环 (推荐)foreach 是迭代数组最常用且最推荐的方式。它简洁、高效,并且不会干扰数组的内部指针。
$data = [
'first' => 'apple',
'second' => 'banana',
'third' => 'orange'
];
foreach ($data as $key => $value) {
echo "键: " . $key . ", 值: " . $value . "\n";
}直接使用数组指针函数 如果确实需要手动控制数组内部指针,可以直接使用 reset(), current(), key(), next(), prev() 等函数。
$data = [
'first' => 'apple',
'second' => 'banana',
'third' => 'orange'
];
reset($data);
while (key($data) !== null) {
echo "键: " . key($data) . ", 值: " . current($data) . "\n";
next($data);
}总之,each() 函数的废弃是PHP语言演进的一部分,旨在提供更清晰、更高效的编程范式。理解其替代方案,特别是掌握 foreach 循环的使用,是编写现代、健壮PHP代码的关键。如果确实需要自定义实现,务必注意细节,确保其行为与预期一致。
以上就是PHP each() 函数的替代与正确实现指南的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号