PHP Australia Conference 2015

reset

(PHP 4, PHP 5)

resetFaz o ponteiro interno de um array apontar para o seu primeiro elemento

Descrição

mixed reset ( array &$array )

reset() retrocede o ponteiro interno de array para o primeiro elemento e retorna o valor do primeiro elemento do array, ou FALSE se o array for vazio.

Parâmetros

array

O array de entrada.

Valor Retornado

Retorna o valor do primeiro elemento do array, ou FALSE se o array estiver vazio.

Exemplos

Exemplo #1 Exemplo da reset()

<?php  
  
$array 
= array('primero passo''segundo passo''terceiro passo''quarto passo');  
  
// por definição, o ponteiro está sobre o primeiro elemento  
echo current($array)."<br />\n"// "Primeiro passo"
  
// pula dois passos  
next($array);  
next($array);  
echo 
current($array)."<br />\n"// "passo três"  
  
// reinicia o ponteiro, começa novamente o primeiro passo  
reset($array);  
echo 
current($array)."<br />\n"// "primeiro passo"  
  
?>

Veja Também

  • current() - Retorna o elemento corrente em um array
  • each() - Retorna o par chave/valor corrente de um array e avança o seu cursor
  • end() - Faz o ponteiro interno de um array apontar para o seu último elemento
  • next() - Avança o ponteiro interno de um array
  • prev() - Retrocede o ponteiro interno de um array

add a note add a note

User Contributed Notes 10 notes

up
10
Mladen Janjetovic
1 year 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
9
milo at mdlwebsolutions dot com
2 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
10
kendsnyder at gmail dot com
4 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
7
Alexandre Koriakine
8 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
4
m dot lebkowski+php at gmail dot com
8 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
4
Colin
8 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.
up
2
leaetherstrip at inbox dot NOSPAMru
9 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
1
gardnerjohng at gmail dot com
12 days ago
If you need an easy way to retrieve the first *key* in an array (instead of the value), it can be done like this:

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

   
#    Will output "colour".
   
echo reset(array_keys($properties));
?>
Potentially helpful for configuration files that define a sequence of items as an associative array.
up
0
Anonymous
8 years ago
I wrote a nice function, which rotates values of array. Very useful for table rows where you have to rotate colors

<?php
function rotate(&$array) {
   
$item = current($array);
    if (!
next($array)) reset($array);  
    return
$item;
}
?>
up
0
kk at shonline dot de
16 years ago
When used on a scalar or unset value, reset() spews warning messages. This is often a problem when accessing arrays generated from HTML form input data: these are scalar or unset if the user didn't enter sufficient information.

You can silence these error messages by prefixing an @ (at sign) to reset(), but it is better style to protect your reset() and the following array traversal with an if (isset()). Example code:

<?php
if (isset($form_array)) {
 
reset($form_array);
  while (list(
$k, $v) = each($form_array) {
   
do_something($k, $v);
  }
}
?>
To Top