数组 函数
在线手册:中文  英文

next

(PHP 4, PHP 5)

next 将数组中的内部指针向前移动一位

说明

mixed next ( array &$array )

next()current() 的行为类似,只有一点区别,在返回值之前将内部指针向前移动一位。这意味着它返回的是下一个数组单元的值并将数组指针向前移动了一位。

参数

array

受影响的 array

返回值

返回数组内部指针指向的下一个单元的值,或当没有更多单元时返回 FALSE

Warning

此函数可能返回布尔值 FALSE,但也可能返回等同于 FALSE 的非布尔值。请阅读 布尔类型章节以获取更多信息。应使用 === 运算符来测试此函数的返回值。

范例

Example #1 next() 及相关函数的用法示例

<?php
$transport 
= array('foot''bike''car''plane');
$mode current($transport); // $mode = 'foot';
$mode next($transport);    // $mode = 'bike';
$mode next($transport);    // $mode = 'car';
$mode prev($transport);    // $mode = 'bike';
$mode end($transport);     // $mode = 'plane';
?>

注释

Note: 你将无法区别包含数组尾以及 boolean FALSE 单元的数组。要正确遍历可能含有空单元或者单元值为 0 的数组,参见 each() 函数。

参见


数组 函数
在线手册:中文  英文

用户评论:

bty-adminf2 at trebly dot net (2012-06-11 18:15:52)

Note that to display the "array_values" into an html page, you must simply write like this  (example with a call to soapClient::__getFunctions()) :

<?php
// .... set new $soap
$result $soap->__getFunctions();
echo(
'<pre>');
print_r(array_values($result));
echo(
'</pre>');
?>

This just because the "array_values" returns a PRE formatted text with CR and blanks chars.

The best is to create into a library the function

<?php
function array_values2html($theArray=array()) {
echo(
'<pre>');
print_r(array_values($result));
echo(
'</pre>');
?>

Remember : "print_r" writes without parameter into the buffer. If you want to get back the content string you must use the $return parameter. So an alternate syntax (more compact) is :

<?php
// .... set new $soap
$result $soap->__getFunctions();
echo(
'<pre>'.print_r(array_values($result,true).'</pre>');
?>

and for the function :

<?php
function array_values2html($theArray=array()) {
return 
'<pre>').print_r(array_values($theArray,true).'</pre>';
}
?>

Finally you will write generally in your compacted code :

<?php
// ... set $result as array
echo (array_values2html($result));
?>

double at dumpit dot de (2009-12-08 13:19:43)

PHP: 5.2.10-2ubuntu6.3 (default apt-get installation on actual, see Date, jaunty 9.10 Ubuntu Distro - G33kWoRDs)

Have a look at your array pointer if you copy an array - the pointer will be copied, too.

For example if you got this construct:
<?php
    $array 
= array('zero','one','two','three','four','five','six','seven');
    
$array2 $array;
    
next($array);
    echo 
key($array);
    echo 
key($array2);

    
// will output:
    // 1
    // 0
?>

But if you copy the array after you've setted the pointer, the pointer will be copied, too:
<?php
    $array 
= array('zero','one','two','three','four','five','six','seven');
    
next($array);
    
$array2 $array;
    echo 
key($array);
    echo 
key($array2);
   
    
// will output:
    // 1 
    // 1
?>

What's more is, that foreach not resetting the pointer after walk through:
<?php

    $array 
= array('zero','one','two','three','four','five','six','seven');
    
next($array);
    
$array2 = array();
    foreach(
$array AS $key => $value){
        echo 
$key;
        
$array2[$key] = $value;
    }
    echo 
var_dump(key($array));
    echo 
key($array2);

    
// will output for foreach:
    // 0 1 2 3 4 5 6 7
    // and for the keys
    // NULL
    // 0
?>

The php-functions seems to reset the pointer on the given position after walk through (i don't know the internal handling - there could be used a copy of the array, too):
<?php

    $array 
= array('zero','one','two','three','four','five','six','seven');
    
next($array);
    
$array2 array_values($array);
    echo 
key($array);
    echo 
key($array2);

    
// will output:
    // 1
    // 0
?>

There are a lot Methods like array_merge($array) that will neither reset the pointer of $array nor copy the pointer to $array2. Have a look on this.
I Hope this was a little helpfull.

ThinkMedical at Gmail dot com (2008-09-02 15:27:00)

regarding references with foreach, you can use them directly. Obviating various posts which provide many lines of 'work arounds'.
$array = array(1,2,3,4,5);
foreach($array as &$value)
or use $key
foreach($array as $key => $value)
{
$array[$key] = '...';
}

adityabhai [at] gmail com [Aditya Bhatt] (2008-05-09 05:14:14)

<?php
class Steps {
   
    private 
$all;
    private 
$count;
    private 
$curr;
   
    public function 
__construct () {
     
      
$this->count 0;
     
    }
   
    public function 
add ($step) {
     
      
$this->count++;
      
$this->all[$this->count] = $step;
     
    }
   
    public function 
setCurrent ($step) {
     
      
reset($this->all);
      for (
$i=1$i<=$this->count$i++) {
        if (
$this->all[$i]==$step) break;
        
next($this->all);
      }
      
$this->curr current($this->all);
     
    }
   
    public function 
getCurrent () {
     
      return 
$this->curr;
     
    }
   
    public function 
getNext () {
     
      
self::setCurrent($this->curr);
      return 
next($this->all);
     
    }
    
    public function 
getPrev () {
     
      
self::setCurrent($this->curr);
      return 
prev($this->all);
     
    }
       
  }
?>

Demo Example:

<?php
   $steps 
= new Steps();
   
$steps->add('1');
   
$steps->add('2');
   
$steps->add('3');
   
$steps->add('4');
   
$steps->add('5');
   
$steps->add('6');
   
$steps->setCurrent('4');
   echo 
$steps->getCurrent()."<br />";
   echo 
$steps->getNext()."<br />";
   echo 
$steps->getPrev()."<br />";
   
$steps->setCurrent('2');
   echo 
$steps->getCurrent()."<br />";
   echo 
$steps->getNext()."<br />";
   echo 
$steps->getPrev()."<br />";
?>

darkside at i dot ua (2007-12-11 03:36:03)

This class implements simple operations with array

<?php
class Steps {
    
    private 
$all;
    private 
$count;
    private 
$curr;
    
    public function 
__construct () {
      
      
$this->count 0;
      
    }
    
    public function 
add ($step) {
      
      
$this->count++;
      
$this->all[$this->count] = $step;
      
    }
    
    public function 
setCurrent ($step) {
      
      
reset($this->all);
      for (
$i=1$i<=$this->count$i++) {
        if (
$this->all[$i]==$step) break;
        
next($this->all);
      }
      
$this->curr current($this->all);
      
    }
    
    public function 
getCurrent () {
      
      return 
$this->curr;
      
    }
    
    public function 
getNext () {
      
      
self::setCurrent($this->curr);
      return 
next($this->all);
      
    }
        
  }
?>

usage example:

<?php
   $steps 
= new Steps();
   
$steps->add('one');
   
$steps->add('two');
   
$steps->add('three');
   
$steps->setCurrent('one');
   echo 
$steps->getCurrent()."<br />";
   echo 
$steps->getNext()."<br />";
   
$steps->setCurrent('two');
   echo 
$steps->getCurrent()."<br />";
   echo 
$steps->getNext()."<br />";
?>

gg2005 at gmail dot com (2007-02-06 13:32:13)

Don't confuse next with continue!
If you're a Perl developer starting with PHP, you might try to use "next" inside a loop to skip to the next iteration...
i.e.,
foreach ($things as $thing) {
if (something I don't like about $thing) {
next;
}
blah....
}
The php compiler will take next... but it's not going to work.
Do this instead:
foreach ($things as $thing) {
if (something I don't like about $thing) {
continue;
}
blah....
}

GPatmore (2006-10-12 12:14:11)

If your using a foreach loop, unless you for a reference, PHP will make a copy of the array to use it the loop.

So, when I need to take a different action for the last element in the array I use the following:

<?php
$ary  
explode(',','a,b,c,d,e,f,g');
foreach(
$ary as $a){
    print 
'letter ' $a;
    if(
next($ary)){
        print 
'<br>';
    }else{
        print 
'<br>dun!';
    }
}
?>

Output:

letter a
letter b
letter c
letter d
letter e
letter f
letter g
dun!

NOTE:: 
PHP5 has added an ability to reference the variable in a foreach like:

<?php
foreach($ary as &$a){}
?>

this will probably cause undesired results when using the method above.

also if the array is changed in any way as to cause the length of the original array to become different then the copy, it will not work.  
Consider the following example:

<?php
$ary  
explode(',','a,b,c,d,e,f,g');
foreach(
$ary as $a){
    print 
'letter ' $a;
    if(
next($ary)){
        unset(
$ary[count($ary) - 1]);
        print 
'<br>';
    }else{
        print 
'<br>dun!';
    }
}
?>

output:

letter a
letter b
letter c
letter d
dun!letter e
dun!letter f
dun!letter g
dun!

tom at nono dot be (2006-07-26 16:19:11)

I see some questions like "how can I know if an array has a next value without changing its internal pointer" and some pretty complicated responses that DO work mind you and in some cases you'll need them...
But suppose you just need a different action within a foreach loop when reaching the final item:
(it won't be usefull in every situation, but in most it will)
$numOfItems = count($someArray);
$counter = 0;
foreach ($someArray as $key => value){
$counter += 1;
if ($counter <> $numOfItems){
//here all next items exist
} else {
//final item
}
}

Sigmar (2006-05-30 15:02:26)

And if you want to know if there are any array elements in array before given key, you can use this function:
function any_array_keys_before($keyname, &$array) {
if (!is_array($array)) {
return false;
}
if (empty($keyname)) {
return false;
}
$set = false;
$count = 0;
foreach ($array as $key => $value) {
if ($set === false && $key != $keyname) {
$count ++;
} else if ($key == $keyname) {
$set = true;
}
}
return $count > 0 ? true : false;
}

Sigmar (2006-05-30 14:52:15)

If you want to check, if there are some more elements in array after given key, you can use the following function:
function more_array_keys($keyname, &$array) {
if (!is_array($array)) {
return false;
}
if (empty($keyname)) {
return false;
}
$set = false;
$count = 0;
foreach ($array as $key => $value) {
if ($set === true) {
$count++;
}
if ($key == $keyname) {
$set = true;
}
}
return $count > 0 ? true : false;
}

tino at infeon dot com (2006-05-13 08:48:22)

this may be handy and i didnt know where else to post it.. i need a simple function to cycle through an array i eventually made it into a class so i could have multiple cycles.. if you like it or find it usefull please email me and let me know
class Cycle
{
var $position;
var $dataArray;
var $dataArrayCount;

function Cycle()
{
$this->dataArray = func_get_args();
$this->dataArrayCount = count($this->dataArray);
}

function Display()
{
$this->position = (!isset($this->position) || $this->position >= ($this->dataArrayCount - 1)) ? 0 : $this->position += 1;
return $this->dataArray[$this->position];
}

}
$bgColor = new Cycle('#000000', '#FFFFFF', '#FF0000');
echo $bgcolor->Display();
//returns #000000
echo $bgcolor->Display();
//returns #FFFFFF
echo $bgcolor->Display();
//returns #FF0000
echo $bgcolor->Display();
//returns #000000

brentimus (2005-04-28 10:10:20)

Papipo's function below is usefull in concept but does not work. 

"Since you do not pass the array by reference, its pointer is only moved inside the function."

This is true, but the array you are manipulating in your has_next() function will have it's pointer set to the first element, not the same position as the original array. What you want to do is pass the array to the has_next() function via reference. While in the has_next() function, make a copy of the array to work on. Find out the current pointer position of the original array and set the pointer on the working copy of the array to the same element. Then you may test to see if the array has a "next" element.

Try the followig insetad:

<?php
function has_next(&$array
{
    
$A_work=$array;  //$A_work is a copy of $array but with its internal pointer set to the first element.
    
$PTR=current($array); 
    
array_set_pointer($A_work$PTR);

    if(
is_array($A_work)) 
    {
        if(
next($A_work)===false
            return 
false;
        else
            return 
true;
    } 
    else 
        return 
false;
}

function 
array_set_pointer(&$array$value)
{
    
reset($array);
    while(
$val=current($array))
    {
        if(
$val==$value
            break;

        
next($array);
    }
}
?>

papipo's gmail account (2004-10-13 01:47:21)

I need to know if an array has more items, but without moving array's internail pointer. Thats is, a has_next() function:

<?php
function has_next($array) {
    if (
is_array($array)) {
        if (
next($array) === false) {
            return 
false;
        } else {
            return 
true;
        }
    } else {
        return 
false;
    }
}

$array = array('fruit''melon');
if (
has_next($array)) {
    echo 
next($array);
}

// prints 'melon'
?>

Since you do not pass the array by reference, its pointer is only moved inside the function.
Hope that helps.

lukasz at karapuda dot com (2004-08-18 10:06:17)

This function will return the previous,next neighbors of an array entry within an associative array. If the specified $key points to the last or first element of the array, the first or last keys of the array will be returned consecutively. This is an improved version of the same function posted earlier.

<?php
function array_neighbor($arr$key)
{
   
$keys array_keys($arr);
   
$keyIndexes array_flip($keys);
  
   
$return = array();
   if (isset(
$keys[$keyIndexes[$key]-1])) {
       
$return[] = $keys[$keyIndexes[$key]-1];
   }
   else {
       
$return[] = $keys[sizeof($keys)-1];
   }
   
   if (isset(
$keys[$keyIndexes[$key]+1])) {
       
$return[] = $keys[$keyIndexes[$key]+1];
   }
   else {
       
$return[] = $keys[0];
   }
   
   return 
$return;
}
?>

court shrock (2004-05-20 16:36:05)

This code returns neighbors of the specified key.  The result will be empty if it doesn't have any neighbors.  My approach was to use the order of keys to determine neighbors, which is differnet from just getting the next/previous element in an array.  Feel free to point out stupidities :)

<?php

function array_neighbor($arr$key)
{
    
krsort($arr);
    
$keys array_keys($arr);
    
$keyIndexes array_flip($keys);
    
    
$return = array();
    if (isset(
$keys[$keyIndexes[$key]-1]))
        
$return[] = $keys[$keyIndexes[$key]-1];
    if (isset(
$keys[$keyIndexes[$key]+1]))
        
$return[] = $keys[$keyIndexes[$key]+1];

    return 
$return;
}

?>

bm at ANTISPAM dot solidwave dot com (2004-04-16 21:49:15)

Take care when replacing code using reset()/next() with code using foreach as foreach does not update the array's internal pointer. This means you cannot, say, use next() to skip an element in foreach loop, or use current() within a function to get a reference to the current element. You probably have code depending on this internal pointer and replacing it will be more work than you anticipated.
See http://www.php.net/foreach

易百教程