reset

(PHP 4, PHP 5, PHP 7, PHP 8)

reset将数组的内部指针设置为其第一个元素

描述

reset(array|object &$array): mixed

reset()array 的内部指针倒回第一个元素,并返回第一个数组元素的值。

参数

array

输入数组。

返回值

返回第一个数组元素的值,如果数组为空则返回 false

警告

此函数可能返回布尔值 false,但也可能返回一个非布尔值,该值计算结果为 false。有关更多信息,请阅读有关 布尔值 的部分。使用 === 运算符 来测试此函数的返回值。

变更日志

版本 描述
8.1.0 object 调用此函数已弃用。先使用 get_mangled_object_vars()object 转换为 array,或者使用实现 Iterator 的类提供的 方法(如 ArrayIterator)来代替。
7.4.0 SPL 类的实例现在被视为没有属性的空对象,而不是调用与该函数同名的 Iterator 方法。

示例

示例 #1 reset() 示例

<?php

$array
= array('step one', 'step two', 'step three', 'step four');

// 默认情况下,指针位于第一个元素上
echo current($array) . "<br />\n"; // "step one"

// 跳过两步
next($array);
next($array);
echo
current($array) . "<br />\n"; // "step three"

// 重置指针,从 step one 重新开始
reset($array);
echo
current($array) . "<br />\n"; // "step one"

?>

注释

注意: 空数组的返回值与包含 bool false 作为第一个元素的数组的返回值无法区分。要正确检查可能包含 false 元素的数组的第一个元素的值,请先检查数组的 count(),或者在调用 reset() 后,检查 key() 是否不为 null

参见

  • current() - 返回数组中的当前元素
  • each() - 返回数组中的当前键值对,并将数组游标向前移动
  • end() - 将数组的内部指针设置为其最后一个元素
  • next() - 将数组的内部指针向前移动
  • prev() - 倒回数组内部指针
  • array_key_first() - 获取数组的第一个键

添加注释

用户贡献注释 13 个注释

4
turabgarip at gmail dot com
3 年前
由于 reset() 在重置其内部指针的同时返回数组的第一个“值”;当它与 key() 组合使用或单独使用时,它将返回不同的结果。例如;

<?php

$products
= array(
'biscuits' => array('biscuit1' => 'cobis', 'biscuit2' => 'probis'),
'chocolates' => array('coco1' => 'cococ', 'coco2' => 'prococ'),
);

echo
key(reset($products['biscuits'])); // 致命错误

reset($products['biscuits']);
echo
key($products['biscuits']); // 将打印 'biscuit1'

?>

这是完全正常的,因为在第一种方法中,reset() 返回了 'biscuits' 元素的第一个“值”,即“cbosi”。所以 key(string) 将会导致致命错误。而在第二种方法中,你只是重置了数组,并没有使用返回值;而是重置了指针,然后提取了数组的第一个键。

如果你的数组有更多维度,它可能不会导致致命错误,但当你组合使用 reset() 和 key() 或连续使用它们时,你将得到不同的结果。
54
milo at mdlwebsolutions dot com
12 年前
陷阱:如果你的第一个元素是 false,你就不知道它是空还是非空。

<?php

$a
= array();
$b = array(false, true, true);
var_dump(reset($a) === reset($b)); //bool(true)

?>

所以不要指望 false 返回值意味着空数组。
9
Bartek Ferek
7 年前
至于获取数组的第一个键,RESET 然后 KEY 比 RESET ARRAY_KEYS 的结果(正如 gardnerjohng at gmail dot com 所建议的)要高效得多。

<?php
reset
($someArray);
echo
key($someArray);
?>

这将给出相同的结果,但速度要快得多。数组越大,性能越好。在 100 个元素的数组上测试,结果快 16 倍。
3
arne dot ludwig at posteo dot de
8 年前
作为对 gardnerjohng 注释的回复,用于检索数组的第一个_键_

要检索数组的第一个_键_,可以使用 reset() 和 key() 的组合。

<?php
$properties
= array(
'colour' => 'grey',
'flavour' => 'rubber',
'name' => 'Mouse Ball',
'texture' => 'rubbery'
);

reset($properties);
echo
key($properties); // => 'colour'
?>

我更喜欢这个解决方案,因为你不需要创建键数组。这应该(未测量)会提高大型数组的性能。
7
Alexandre Koriakine
18 年前
它也很好地以这种方式重置多维数组

reset($voo2['moder']);
while (list($key, $value) = each ($voo2['moder'])) {

reset($voo2['moder'][$key]);
while (list($key1, $value1) = each ($voo2['moder'][$key])) {
#做你想做的
}

}
6
Mladen Janjetovic
11 年前
请注意,你不能在这里使用指针。在这种情况下,它会重置迭代计数器。
foreach($array as $key=>&$value) {...}


使用标准的 foreach 而不是
foreach($array as $key=>$value) {...}
5
leaetherstrip at inbox dot NOSPAMru
19 年前
请注意,reset() 不会影响多维数组的子数组。

例如,

<?php
$arr
= array(
1 => array(2,3,4,5,6),
2 => array(6,7,8,9,10)
);

while(list(
$i,) = each($arr))
{
echo
"IN \$arr[$i]<br>";

while(list(
$sub_i,$entry) = each($arr[$i]))
{
echo
"\$arr[$i][$sub_i] = $entry<br>";
}
}

reset($arr);

// 再次执行相同的操作
while(list($i,) = each($arr))
{
echo
"IN \$arr[$i]<br>";

while(list(
$sub_i,$entry) = each($arr[$i]))
{
echo
"\$arr[$i][$sub_i] = $entry<br>";
}
}
?>

将打印

IN $arr[1]
$arr[1][0] = 2
$arr[1][1] = 3
$arr[1][2] = 4
$arr[1][3] = 5
$arr[1][4] = 6
IN $arr[2]
$arr[2][0] = 6
$arr[2][1] = 7
$arr[2][2] = 8
$arr[2][3] = 9
$arr[2][4] = 10
IN $arr[1]
IN $arr[2]
2
arne dot slabbinck at duo dot be
8 年前
信息

以下代码在 5.4.45 中会发出严格警告

return reset(array_keys($result['node']));

"严格警告:只能通过引用传递变量"

所以应该是

$keys = array_keys($result['node']);
return reset($keys);
2
kendsnyder at gmail dot com
14 年前
不要使用 `reset()` 来获取关联数组的第一个值。它非常适合真正的数组,但在迭代器对象上却会产生意外结果。 http://bugs.php.net/bug.php?id=38478
1
m dot lebkowski+php at gmail dot com
18 年前
Colin,有一个更好的(在我看来)方法来解决你的问题。
<?
// ...
foreach($a as $k => &$d){} // 注意“&”
// ...
?>
这是 PHP5 中使用 foreach 循环引用的一种新功能。通过这种方式,PHP 不会创建数组的副本,因此内部指针不会重置。
-1
Colin
18 年前
我在 PHP 5.0.5 中遇到了一个问题,不知何故它会重置数组的子数组,没有任何明显的原因。问题是在对父数组执行 foreach() 时,PHP 会创建子数组的副本,这样做会重置原始数组的内部指针。

以下代码演示了子数组的重置

<?
$a = array(
'a' => array(
'A', 'B', 'C', 'D',
),
'b' => array(
'AA', 'BB', 'CC', 'DD',
),
);

// 将 $a 的指针设置为 'b',并将 'b' 的指针设置为 'CC'
reset($a);
next($a);
next($a['b']);
next($a['b']);
next($a['b']);

var_dump(key($a['b']));
foreach($a as $k => $d)
{
}
var_dump(key($a['b']));
?>

两次 var_dump 的结果分别是 3 和 0。很明显,$a['b'] 的内部指针在对 $a 进行 foreach 循环时被重置了。

每次 foreach 循环迭代 $a 的 'a' 和 'b' 键时,它都会将 $a['a'] 和 $a['b'] 复制到 $d 中,这会重置 $a['a'] 和 $a['b'] 的内部指针,尽管没有进行明显的更改。

解决方案是迭代 $a 的键。

<?
foreach(array_keys($a) as $k)
{
}
?>

并使用 $a[$k](或创建 $a[$k] 的别名 $d 并处理使用别名的后果)。

出于好奇,我正在对一个虚拟对象实现迭代器接口,并调用一个全局对象来进行实际的迭代(这也是为了应对 PHP 缺乏 C 风格的指针,当对对象进行 $a = $b 时,当修改时 $a 中的数据与 $b 中的数据不一致)。由于我有许多代表不同数据集的虚拟对象,我选择将每个数据集存储为全局对象中包含的子数组。为了使这工作,每个虚拟对象都必须存储一个键(可以自由地重复而不会出现问题),当在虚拟对象上调用 rewind、key、current、next 和 valid 时,它会将该键传递给全局对象。

不幸的是,我的键需要不仅仅是一个简单的字符串或数字(如果是这样,那么它可以直接用来索引该对象的子数组数据,并且问题可以避免),而是一个字符串数组。相反,我必须迭代(使用 foreach 循环)每个子数组并将键与子数组中存储的变量进行比较。

因此,通过以这种方式使用 foreach 循环,以及 PHP 重置子数组的指针,最终会导致无限循环。

实际上,这可以通过 PHP 即使在复制后也维护数组的内部指针来解决。
-6
gardnerjohng at gmail dot com
9 年前
如果你需要一个简单的方法来检索数组中的第一个 *键*(而不是值),可以像这样完成

<?php
$properties
= array(
'colour' => 'grey',
'flavour' => 'rubber',
'name' => 'Mouse Ball',
'texture' => 'rubbery'
);

# 将输出 "colour"。
echo reset(array_keys($properties));
?>
可能对定义项目序列的关联数组的配置文件很有用。
-22
Anonymous
18 年前
我写了一个不错的函数,它可以旋转数组的值。对于必须旋转颜色的表格行非常有用

<?php
function rotate(&$array) {
$item = current($array);
if (!
next($array)) reset($array);
return
$item;
}
?>
To Top