• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • next()

    (PHP 4, PHP 5, PHP 7)

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

    说明

    next(array &$array): mixed

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

    参数

    $array

    受影响的array。

    返回值

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

    Warning

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

    范例

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

    <?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:你将无法区别包含数组尾以及booleanFALSE单元的数组。要正确遍历可能含有空单元或者单元值为 0 的数组,参见each()函数。

    参见

    • current() 返回数组中的当前单元
    • end() 将数组的内部指针指向最后一个单元
    • prev() 将数组的内部指针倒回一位
    • reset() 将数组的内部指针指向第一个单元
    • each() 返回数组中当前的键/值对并将数组指针向前移动一步
    Now from PHP 7.2, the function "each" is deprecated, so the has_next I've posted is no longer a good idea. There is another to keep it simple and fast:
    <?php
    function has_next(array $_array)
    {
     return next($_array) !== false ?: key($_array) !== null;
    }
    ?>
    
    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....
    }
    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);
      }
    }
    ?>
    
    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.
    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
    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;
    }
    ?>
    
    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;
    }
    ?>
    
    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] = '...';
    }
    This function returns next element in array after your key or false if it last or key doesn't exists in array.
    <?php
    function nextElement(array $array, $currentKey)
    {
      if (!isset($array[$currentKey])) {
        return false;
      }
      $nextElement = false;
      foreach ($array as $key => $item) {
        $nextElement = next($array);
        if ($key == $currentKey) {
          break;
        }
      }
      return $nextElement;
    }
    brentimus' array_set_pointer function will only work if the array value is unique in the array, and none of the array values are FALSE. It would be more reliable to use key() instead of current(). For similar reasons it's better to check key() after calling next() to determine whether the next() element "exists". Simply checking the value returned by next() will produce a false negative when looking at, for example, the first element of the array: ['one', 0, 'three']
    However, it also turns out that the copied array retains the original array's pointer, so array_set_pointer is not actually required here. The following should work:
    <?php
    function has_next(array &$array) {
      $A_work = $array; // $A_work is a copy of $array including its internal pointer.
      next($A_work);
      if (key($A_work) === NULL)
        return false;
      else
        return true;
    }
    ?>
    
    a more readable version of papipo's has_next function:
    <?php
    function has_next($array) {
      $has_next = is_array($array) && next($array) !== false;
      return $has_next;
    }
    ?>
    OR
    <?php
    function has_next($array) {
      $has_next = false;
      if(is_array($array)) {
        $has_next = next($array) !== false;
      }
      return $has_next;
    }
    ?>
    
    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($count, $key = null, $arRelated = array(), $cntRelated = 2)
    {  
      if($count > 0 && isset($key))
      {    
        $keyL = $count - 1; 
        $keyR = 1;
        $arResult = array();
        for($i = 1; $i <= $cntRelated; $i++)
        {
          if($key == 0)
          {
            if(($i % 2) == 0)
            {
              $curKey = $count - $keyL;
              $keyL--;
            }
            else
            {
              $curKey = $count - $keyR;
              $keyR++;
            }
          }
          else
          {
            if($arRelated[$i] >= $count - 1)
            {
              $curKey = 0;
            }
            else
            {
              $curKey = $arRelated[$i] + 1;
            }
          }
          $arResult[$i] = $curKey;  
        }
        return $arResult;
      }
    }
    $arr = range(0, 4);
    $count = count($arr);
    foreach($arr as $key => $v)
    {
      if($arRelated = array_neighbor($count, $key, $arRelated))
      {
        $arHeighbor[$key]['RELATED'] = $arRelated;
      }
    }
    echo '<pre>';print_r($arHeighbor); echo '</pre>';
    ?>
    Array
    (
      [0] => Array
        (
          [RELATED] => Array
            (
              [1] => 4
              [2] => 1
            )
        )
      [1] => Array
        (
          [RELATED] => Array
            (
              [1] => 0
              [2] => 2
            )
        )
      [2] => Array
        (
          [RELATED] => Array
            (
              [1] => 1
              [2] => 3
            )
        )
      [3] => Array
        (
          [RELATED] => Array
            (
              [1] => 2
              [2] => 4
            )
        )
      [4] => Array
        (
          [RELATED] => Array
            (
              [1] => 3
              [2] => 0
            )
        )
    )
    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.
    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 />";
    ?>
    
    After dealing with the fact that next() will either returns FALSE when there is no further element in the array or if the element itself is FALSE, I finally find a way to do a has_next() method, which will never fails. You can ignore and/or downvote my last comment, this it will be deleted.
    Here is the code that work :
    <?php
      function has_next(array $a){
        return next($a) !== false ?: each($a) !== false;
      }
    ?>
    
    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

    上篇:natsort()

    下篇:pos()