PHP 8.4.0 RC4 available for testing

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"

// 重置指针,重新指向第一个元素
reset($array);
echo
current($array) . "<br />\n"; // "step one"

?>

注释

注意: 返回的值无法区分是空数组,还是第一个元素是 bool false。 要正确检测数组第一个元素包含 false 的情况,首先要检测数组 count(), 或在调用 reset() 后检测 key() 不为 null

参见

  • current() - 返回数组中的当前值
  • each() - 返回数组中当前的键/值对并将数组指针向前移动一步
  • end() - 将数组的内部指针指向最后一个单元
  • next() - 将数组中的内部指针向前移动一位
  • prev() - 将数组的内部指针倒回一位
  • array_key_first() - 获取指定数组的第一个键

添加备注

用户贡献的备注 11 notes

up
55
milo at mdlwebsolutions dot com
12 years ago
GOTCHA: If your first element is false, you don't know whether it was empty or not.

<?php

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

?>

So don't count on a false return being an empty array.
up
4
turabgarip at gmail dot com
3 years ago
Since reset() returns the first "value" of the array beside resetting its internal pointer; it will return different results when it is combined with key() or used separately. Like;

<?php

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

echo
key(reset($products['biscuits'])); // Fatal error

reset($products['biscuits']);
echo
key($products['biscuits']); // Will print 'biscuit1'

?>

This is perfectly normal because in the first method, reset() returned the first "value" of the 'biscuits' element which is to be "cbosi". So key(string) will cause a fatal error. While in the second method you just reset the array and didn't use a returning value; instead you reset the pointer and than extracted the first key of an array.

If your array has more dimensions, it won't probably cause a fatal error but you will get different results when you combine reset() and key() or use them consecutively.
up
9
Bartek Ferek
8 years ago
As for taking first key of an array, it's much more efficient to RESET and then KEY, rather then RESET result of ARRAY_KEYS (as sugested by gardnerjohng at gmail dot com).

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

This will give the same result but is much much faster. Larger arrays, better performance. Tested on 100-elements long array with 16 times faster results.
up
3
arne dot ludwig at posteo dot de
9 years ago
In response to gardnerjohng's note to retrieve the first _key_ of an array:

To retrieve the first _key_ of an array you can use the combination of reset() and key().

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

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

I prefer this solution as you don't have to create the keys array. This should (not measured) improve performance on large arrays.
up
6
Mladen Janjetovic
11 years ago
Note that you can't use pointer here. It will reset the iteration counter in this case.
foreach($array as $key=>&$value) {...}


Use standard foreach instead
foreach($array as $key=>$value) {...}
up
6
Alexandre Koriakine
18 years ago
Also it's good to reset this way the multidimentional arrays:

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

reset($voo2['moder'][$key]);
while (list($key1, $value1) = each ($voo2['moder'][$key])) {
#do what u want
}

}
up
5
leaetherstrip at inbox dot NOSPAMru
20 years ago
Note that reset() will not affect sub-arrays of multidimensional array.

For example,

<?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);

// Do the same again
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>";
}
}
?>

will print

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]
up
2
arne dot slabbinck at duo dot be
9 years ago
Info:

Following code gives a strict warning in 5.4.45

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

"Strict warning: Only variables should be passed by reference"

So should be:

$keys = array_keys($result['node']);
return reset($keys);
up
2
kendsnyder at gmail dot com
14 years ago
Don't use `reset()` to get the first value of an associative array. It works great for true arrays but works unexpectedly on Iterator objects. http://bugs.php.net/bug.php?id=38478
up
1
m dot lebkowski+php at gmail dot com
18 years ago
Colin, there`s a better (IMO) way to solve your problem.
<?
// ...
foreach($a as $k => &$d){} // notice the "&"
// ...
?>
It`s a new feature in PHP5 to use references in foreach loop. This way PHP isn`t making a copy of the array, so the internal pointer won`t be reset.
up
-1
Colin
18 years ago
I had a problem with PHP 5.0.5 somehow resetting a sub-array of an array with no apparent reason. The problem was in doing a foreach() on the parent array PHP was making a copy of the subarrays and in doing so it was resetting the internal pointers of the original array.

The following code demonstrates the resetting of a subarray:

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

// Set the pointer of $a to 'b' and the pointer of 'b' to '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']));
?>

The result of the two var dumps are 3 and 0, respectively. Clearly the internal pointer of $a['b'] was reset by doing the foreach loop over $a.

Each time the foreach loop iterated over the 'a' and 'b' keys of $a it made a copy of $a['a'] and $a['b'] into $d which resetted the internal pointers of $a['a'] and $a['b'] despite making no obvious changes.

The solution is instead to iterate over the keys of $a.

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

and using $a[$k] (or creating an alias of $a[$k] as $d and dealing with the consequences of using aliases).

For the curious, I was implementing the Iterator interface on a dummy object and calling a global object to do the actual iteration (also to cope with PHP's lack of C-style pointers which when doing a $a = $b on objects would cause the data in $a to be inconsistent with the data in $b when modified). Being that I had many dummy objects representing different data sets I chose to store each data set as a subarray contained within the global object. To make this work each dummy object has to store a key (which can freely be duplicated without problems) that it passes to the global object when rewind, key, current, next, and valid were called on the dummy object.

Unfortunately for me, my key required to be more than just a simple string or number (if it was then it could be used to directly index the subarray of data for that object and problem avoided) but was an array of strings. Instead, I had to iterate over (with a foreach loop) each subarray and compare the key to a variable stored within the subarray.

So by using a foreach loop in this manner and with PHP resetting the pointer of subarrays it ended up causing an infinite loop.

Really, this could be solved by PHP maintaining internal pointers on arrays even after copying.
To Top