each

(PHP 4, PHP 5, PHP 7)

each从数组中返回当前键值对并向前移动数组游标

警告

此函数在 PHP 7.2.0 中已 **弃用**,并在 PHP 8.0.0 中 **移除**。强烈建议不要依赖此函数。

说明

each(array|object &$array): array

从数组中返回当前键值对并向前移动数组游标。

each() 执行完毕后,数组游标将指向数组的下一个元素,如果到达数组末尾,则指向最后一个元素之后。如果您想使用 each 再次遍历数组,则必须使用 reset()

参数

array

输入数组。

返回值

返回数组 array 中的当前键值对。此对以一个包含四个元素的数组形式返回,其键为 01keyvalue。元素 0key 包含数组元素的键名,元素 1value 包含数据。

如果数组的内部指针指向数组内容的末尾之后,each() 将返回 **false**。

示例

示例 #1 each() 示例

<?php
$foo
= array("bob", "fred", "jussi", "jouni", "egon", "marliese");
$bar = each($foo);
print_r($bar);
?>

$bar 现在包含以下键值对

Array
(
    [1] => bob
    [value] => bob
    [0] => 0
    [key] => 0
)

<?php
$foo
= array("Robert" => "Bob", "Seppo" => "Sepi");
$bar = each($foo);
print_r($bar);
?>

$bar 现在包含以下键值对

Array
(
    [1] => Bob
    [value] => Bob
    [0] => Robert
    [key] => Robert
)

each() 通常与 list() 结合使用以遍历数组,以下是一个示例

示例 #2 使用 each() 遍历数组

<?php
$fruit
= array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');

reset($fruit);
while (list(
$key, $val) = each($fruit)) {
echo
"$key => $val\n";
}
?>

以上示例将输出

a => apple
b => banana
c => cranberry

注意

由于将数组分配给另一个变量会重置原始数组的指针,因此如果我们在循环中将 $fruit 分配给另一个变量,上面的示例会导致无限循环。

警告

each() 也可以接受对象,但可能会返回意外结果。因此,不建议使用 each() 迭代对象属性。

参见

添加笔记

用户贡献笔记 25 notes

up
10
janhsh
1 年前
在 each() 函数被弃用后,以下是如何修正您的源代码的方法

如果您在 while 循环中使用 each(),例如

while (list($Key,$Value)=@each($Array)){
....
}

您需要将其替换为

foreach ($Array as $Key => $Value){
....
}

同样,

while (list(,$Value)=@each($Array)){
....
}

将变为

foreach ($Array as $Value){
....
}
up
39
wolfeym38 at yahoo dot com
17 年前
关于 foreach 与 while(list) = each 的速度
我编写了一个基准测试脚本,结果清楚地表明 foreach 更快。快得多。即使对于大型数组(尤其是大型数组)。我在 100,000、1,000,000 和 10,000,000 的大小下进行了测试。为了使用 1000 万进行测试,我不得不将内存限制设置得非常高,它在实际运行时接近 1gb。无论如何,

<?php
function getDiff($start, $end) {
$s = explode(' ', $start);
$stot = $s[1] + $s[0];
$e = explode(' ', $end);
$etot = $e[1] + $e[0];
return
$etot - $stot;
}

$lim=10000000;
$arr = array();
for (
$i=0; $i<$lim; $i++) {
$arr[$i] = $i/2;
}

$start = microtime();
foreach (
$arr as $key=>$val);

$end = microtime();
echo
"time for foreach = " . getDiff($start, $end) . ".\n";

reset($arr);
$start = microtime();
while (list(
$key, $val) = each($arr));
$end = microtime();
echo
"time list each = " . getDiff($start, $end) . ".\n";
?>

以下是我的一些结果:使用 1,000,000
time for foreach = 0.0244591236115.
time list each = 0.158002853394.
desktop:/media/sda5/mpwolfe/tests$ php test.php
time for foreach = 0.0245339870453.
time list each = 0.154260158539.
desktop:/media/sda5/mpwolfe/tests$ php test.php
time for foreach = 0.0269000530243.
time list each = 0.157305955887.

然后使用 10,000,000
desktop:/media/sda5/mpwolfe/tests$ php test.php
time for foreach = 1.96586894989.
time list each = 14.1371650696.
desktop:/media/sda5/mpwolfe/tests$ php test.php
time for foreach = 2.02504014969.
time list each = 13.7696218491.
desktop:/media/sda5/mpwolfe/tests$ php test.php
time for foreach = 2.0246758461.
time list each = 13.8425710201.

顺便说一句,这些结果是在 PHP 5.2 上得到的,使用的是 Linux 机器,拥有 3GB 内存和 2.8GHz 双核奔腾处理器。
up
17
phpcoder at gmail dot com
5 年前
each 被弃用,因为它暴露了太多内部实现细节,阻碍了语言开发。(“我们不能做 X,因为它会破坏 each()。”)

https://wiki.php.net/rfc/deprecations_php_7_2#each

如果你想要数组指针,请自行维护它。这可能也是一个好主意,因为这样它就会在代码中可见。
up
10
dmikam
3 年前
该函数在 PHP 7.2.0 中被标记为已弃用,并在 PHP 8.0.0 中被移除,旧代码的替换如下所示

function legacy_each($array){
$key = key($array);
$value = current($array);
$each = is_null($key) ? false : [
1 => $value,
'value' => $value,
0 => $key,
'key' => $key,
];
next($array);
return $each;
}
up
6
man13or at hotmail dot fr
4 年前
您好,由于 each() 和 list() 经常“出卖”非常旧的应用程序,我建议不要再使用它们了。

如果你想根据关联数组分配变量,
将以下代码

while(list ($key, $value) = each ($my_array)) {
$$key = $value;
}

替换为以下代码

foreach ($my_array as $key => $value) {
$$key = $value;
}
up
12
sjoerd-php at linuxonly dot nl
18 年前
使用 foreach 代替 while、list 和 each。foreach 是
- 更易于阅读
- 速度更快
- 不受数组指针的影响,因此不需要 reset()。

它按以下方式工作
<?php
$arr
= array('foo', 'bar');
foreach (
$arr as $value) {
echo
"The value is $value.";
}

$arr = array('key' => 'value', 'foo' => 'bar');
foreach (
$arr as $key => $value) {
echo
"Key: $key, value: $value";
}
?>
up
2
Henk Poley
4 年前
Rector 拥有一个自动修复('ListEachRector')来迁移到 `each()` 之外

https://github.com/rectorphp/rector/blob/master/docs/AllRectorsOverview.md#listeachrector

如果你查看代码示例,你会发现手动操作也很简单。
up
4
james at gogo dot co dot nz
19 年前
值得注意的是,对数组的引用没有自己的数组指针,对数组进行引用不会重置它的数组指针,因此,正如你所预期的那样,它会遍历数组的前三个元素,而不是遍历第一个元素 3 次。

<?php
$x
= array(1,2,3);

print_r(each($x));
echo
"\n";

$y =& $x;
print_r(each($y));
echo
"\n";

$z =& $y;
print_r(each($z));
echo
"\n";
?>
up
3
Sopinon
19 年前
如果你想显示数组的整个结构(树),可以使用以下递归解决方案。

<?PHP
$tree
= "";
array_tree($your_array);
echo
$tree;

// 递归函数
function array_tree($array, $index=0){
global
$tree;
$space="";
for (
$i=0;$i<$index;$i++){
$space .= " ";
}
if(
gettype($array)=="array"){
$index++;
while (list (
$x, $tmp) = each ($array)){
$tree .= $space."$x => $tmp\n";
array_tree($tmp, $index);
}
}
}
?>
up
2
Anonymous
6 年前
一个奇怪的被弃用的函数。如果你在一个 foreach 循环之外跟踪集合中的数组指针,你并不关心性能,而该函数的效用是核心。

相反,你必须调用两个函数:current(),然后是 next() 来复制它的行为。
up
2
michael k (name der redaktion bekannt.)
17 年前
如果你想遍历一个二维稀疏数组,并首先显示每个第一个元素,然后显示每个第二个元素,依此类推,可以使用以下代码

$fruits = array ( "fruits" => array ( "a" => "orange",
"b" => "banana",
"c" => "apple"
),
"numbers" => array ( 1,
2,
3,
4,
5,
6
),
"holes" => array ( "first",
5 => "second",
"third",
10 => "fourth",
)
);

$done = False;
while ($done == False) {
$done = True;

// 重要:&$val 必须是引用(使用 &),
// 如果你不这样做,$val 的内部计数器将在
// 每次重新初始化,并且你会循环遍历第一个元素
// 永无止境。

foreach($fruits as $key => &$val) {

if (list($inner_key, $inner_val) = each(&$val)) {
$done = False;
echo "$key : : $inner_key => $inner_val <br> \n";
}

}
}

注意:这只是一个快速解决方法,如果你知道更好的方法,请发布它!
up
1
wodzuY2k at anronet dot pl
22 年前
此函数将帮助您将任何变量转储到 XML 结构中。

// 将变量转储到简单的 XML 结构中
function var_dump_xml($tagname, $variable, $level = 0)
{
for ($i = 0; $i < $level; $i++) $marg .= ' ';
if (eregi('^[0-9].*$', $tagname)) $tagname = 'tag_' . $tagname; // XML 标签不能以 [0-9] 字符开头
if (is_array($variable))
{
echo $marg . "<$tagname>\n";
while (list($key, $val) = each($variable)) var_dump_xml($key, $val, $level + 1);
echo $marg . "</$tagname>\n";
}
elseif (strlen($variable) > 0)
{
echo $marg . "<$tagname>" . htmlspecialchars($variable) . "</$tagname>\n";
};
};

/*
示例

$myVar = array("name" => "Joe", "age" => "26", "children" => array("Ann", "Michael"));
var_dump_xml("myVarTag", $myVar);
*/
up
1
matthew at mhalls dot net
18 年前
至 panania at 3ringwebs dot com

如果您确定只接收一行,则 while 变得多余。 为了缩短代码

$strSQL = "SELECT * FROM table WHERE id=1";
$RecordsetSelect = $db->runQuery($strSQL);
list($key, $val) = mysql_fetch_row($RecordsetSelect);
echo "$key => $val\n";
mysql_free_result($RecordsetSelect);

只有一行被返回,这是一个更优雅的解决方案,但本质上只是吹毛求疵。 它还展示了使用 list 的另一种快速方法。
up
-1
massimo dot modica at tin dot it
14 年前
如果您忘记在每次调用 each() 之前重置数组,相同的代码可能会在不同的 php 版本中产生不同的结果。

<?php

$a
= array(1,2,3);

foreach (
$a AS $k => $v) $a[$k] = 2*$v;

while(list(
$k2, $v2) = each($a)) { echo($v2."\n"); }

?>

在 PHP 5.2.0 中

2
4
6

在 PHP 5.2.6 中

4
6
up
-1
tk at turtle-entertainment dot de
23 年前
确保使用集成的函数 "unset();" 或 "reset();" - 许多人忘记了这一点,并对生成的输出感到困惑!
up
-1
Anonymous
22 年前
我通常使用二维数组工作很多。 由于我在正确遍历它们方面遇到了一些麻烦,也许那里有人也遇到了这些问题,并且可以使用这个。

它基于一个名为 $array[$x][$y] 的二维数组。 在某些(但不一定是所有)(x,y) 处,存在我想要达到的值。 请注意,我事先不知道 $x 或 $y 的范围(即它们的最大值和最小值)。

while (list($x, $tmp) = each($array)) {
while (list($y, $val) = each($tmp)) {
echo "$x, $y, $val";
}
}

因此,对于每个 (x,y) 对的答案可以是(当然,前提是这些值之前在您的数组中)

1, 1, 2
2, 2, 0
3, 1, 1
5, 2, 2
5, 1, 2

请注意,只显示了具有相应值的 (x,y) 对。

坚持住
Jon Egil Strand
NTNU
up
-2
amby2 at izh dot com
18 年前
我发现了一种使用 for 语句循环遍历关联数组的紧凑方法(不是 while,因为它在下面大多数示例中都已完成)

<?php

for (reset($array); list($key) = each($array);) {
echo
$key;
echo
$array[$key];
}

?>

或者

<?php

for (reset($array); list($key, $value) = each($array);) {
echo
$key;
echo
$value;
echo
$array[$key];
}

?>

使用这种结构,您几乎不会忘记添加 reset($array) 代码行。
up
-2
13975001197 at 163 dot com
6 年前
在 PHP 7.2 中,我们可以使用 foreach() 替换 each(),例如

foreach($array as $key => $value) {
// 做点什么
}
up
-3
Gillis at dancrea dot com
22 年前
我编写了一个简短且非常简单的脚本,用于在关联数组中搜索值的某个值,这是一个简化的示例

<?php

$foo
['bob'] = "bob is ugly";
$foo['bill'] = "bill is rich";
$foo['barbie'] = "barbie is cute";
$search = "rich";

echo
"searching the array foo for $search:<br>";
reset ($foo);
while (list (
$key, $val) = each ($foo)) {
if (
preg_match ("/$search/i", $val)) {
print
"A match was found in $key.<br />";
} else {
print
"A match was not found in $key.<br />";
}
}

?>

将输出
在数组 foo 中搜索 rich
在 bob 中未找到匹配项
在 bill 中找到了匹配项
在 barbie 中未找到匹配项
up
-3
php at omit dot ianco dot co dot uk
16 年前
我希望能够在循环遍历数组时向数组添加内容。 foreach 不允许这样做,因为它使用的是数组的秘密副本。 each 使这成为可能(在 PHP 4 上测试)。
<?php
$shopping_list
= array('oysters', 'caviare');
reset ($shopping_list);
while (list(
$key, $value) = each ($shopping_list)) {
if (
$value == 'oysters') $shopping_list[] = 'champagne';
elseif (
$value == 'champagne') $shopping_list[] = 'ice';
}
print_r($shopping_list);
// Array ( [0] => oysters [1] => caviare [2] => champagne [3] => ice )
?>
up
-5
gaviel
13 年前
好的,这里有一个用于迭代多维数组的示例... 使用 foreach

<?php
$members
= array(
"member1" => array (
"First Name" => "Robert",
"Last Name" => "Burton",
"Age" => "20"
),
"member2" => array (
"First Name" => "Cheska",
"Last Name" => "Vladesk",
"Age" => "21"
),
"member3" => array (
"First Name" => "Gino",
"Last Name" => "Marley",
"Age" => "19"
),
"member4" => array (
"First Name" => "Jake",
"Last Name" => "White",
"Age" => "16"
),
);
$dataSetCount = count($members);
echo
"<h1>There are $dataSetCount members</h1>";

$i = 0;
foreach (
$members as $each_members) {
$i++;
echo
"<h2>Member $i</h2>";
foreach (
$each_members as $position => $details) {
echo
"<b>$position</b>" . ": " . $details . "<br />";
}
}
?>
up
-4
kris at angelanthony dot com
23 年前
请记住,如果您多次使用 "each()" 迭代数组,请使用 "reset()"! 例如

while(list($key,$value) = each($array)){
// 代码在此处
}

现在,$array 上的内部指针位于数组的末尾,再次尝试像上面一样的迭代将导致“while”块中的代码执行零次。在再次从第一个元素开始遍历数组之前,您**必须**调用“reset($array)”来重置内部数组指针。
up
-5
nino dot skopac at gmail dot com
9 年前
<?php
function each_v2($arr) {
// 与 each() 相同,但在到达数组末尾时,它会重置数组
static $i = 0;

if (isset(
$arr[$i])) {
// 存在
return $arr[$i++];
} else {
// 将 $i 重置为 0 并重复
$i = 0;
return
each_v2($arr);
}
}
?>
up
-5
ayyappan dot ashok at gmail dot com
8 年前
/* 使用 each 迭代对象 */

class SAI
{
public function __toString()
{
return __CLASS__;
}
}
$a = new SAI();
$b = new SAI();
$c = new SAI();
$d = new SAI();
$e = new SAI();

$objarray = array($a,$b,$c,$d,$e);
reset($objarray);
while (list($key, $val) = each($objarray))
{
echo "$key => $val\n";
}
//结果
0 => SAI
1 => SAI
2 => SAI
3 => SAI
4 => SAI

警告
each() 也可以接受对象,但可能会返回意外的结果。因此,不建议使用 each() 遍历对象属性。
up
-20
janhsh at tiscalinet dot be
6 年前
以下示例在 PHP 7 中无效

<?php
$fruit
= array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');

reset($fruit);
while (list(
$key, $val) = each($fruit)) {
echo
"$key => $val\n";
}
?>

正确的写法是
<?php
$fruit
= array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');

reset($fruit);
while (
$Item= each($fruit)) {
$key=$Item[0];
$val=$Item[1];
echo
"$key => $val\n";
}
?>

这是因为左侧的“list ()”命令在 PHP 7 中不再有效,并且没有替代命令。
这非常令人遗憾,因为该命令被广泛使用,并且允许以简单的方式从数组分配变量。
To Top