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

current

(PHP 4, PHP 5)

current返回数组中的当前单元

说明

mixed current ( array &$array )

每个数组中都有一个内部的指针指向它“当前的”单元,初始指向插入到数组中的第一个单元。

current() 函数返回当前被内部指针指向的数组单元的值,并不移动指针。如果内部指针指向超出了单元列表的末端,current() 返回 FALSE

Warning

如果数组包含有空的单元(0 或者 "",空字符串)则本函数在碰到这个单元时也返回 FALSE。这使得用 current() 不可能判断是否到了此数组列表的末端。要正确遍历可能含有空单元的数组,用 each() 函数。

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

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

参见 end()key()next()prev()reset()


数组 函数
在线手册:中文 英文
PHP手册
PHP手册 - N: 返回数组中的当前单元

用户评论:

michael at squiloople dot com (11-Jan-2012 03:44)

current() also works on objects:

<?php

 
echo current((object) array('one', 'two')); // Outputs: one

?>

marc dot hanisch at nospam dot ateam dot de (19-May-2010 02:37)

current() works with functions returning an array, too.
This is helpfull to get the first element of the returned array.

Note that current() with functions always returns the first element, because there is no variable the array was assigned to (and therefore no pointer).

Example:

<?php
//get the first element of the returned array
$element = current(get_my_arrays());
?>

In addition, current() with functions will not behave as assumed if your function returns an array reference and modifies the arrays pointer, of course!

aefxx (15-May-2008 04:39)

A simple copy function that not only copies the given array but ensures the copy's pointer is set to the exact same position:

<?php
function array_copy(&array)
{
   
$key = key($array);
   
$copy = $array;

    while ((
$copy_key = key($copy)) !== NULL) {
        if (
$copy_key == $key) break;
       
next($copy);
    }

    return
$copy;
}
?>

That's all ... bye.

gregory at gregory dot net (28-Feb-2008 05:07)

It took me a while to figure this out, but there is a more consistent way to figure out whether you really went past the end of the array, than using each().

You see, each() gets the value BEFORE advancing the pointer, and next() gets the value AFTER advancing the pointer. When you are implementing the Iterator interface, therefore, it's a real pain in the behind to use each().

And thus, I give you the solution:
To see if you've blown past the end of the array, use key($array) and see if it returns NULL. If it does, you're past the end of the array -- keys can't be null in arrays.

Nifty, huh? Here's how I implemented the Iterator interface in one of my classes:

<?php

/**
 * DbRow file
 * @package PalDb
 */

/**
 * This class lets you use Db rows and object-relational mapping functionality.
 */
 
class DbRow implements Iterator
{
   
/**
     * The DbResult object that gave us this row through fetchDbRows
     * @var DbResult
     */
   
protected $result;
   
   
/**
     * The fields of the row
     * @var $fields
     */
   
protected $fields;
       
   
/**
     * Constructor
     *
     * @param PDOStatement $stmt
     *  The PDO statement object that this result uses
     * @param DbResult $result
     *  The result that produced this row through fetchDbRows
     */
   
function __construct($result)
    {
       
$this->result = $result;
    }
   
   
/**
     * Get the DbResult object that gave us this row through fetchDbRows
     * @return DbResult
     *
     * @return unknown
     */
   
function getResult()
    {
        return
$this->result;
    }
   
    function
__set(
       
$name,
       
$value)
    {
       
$this->fields[$name] = $value;
    }
   
    function
__get(
       
$name)
    {
        if (isset(
$this->fields[$name]))
            return
$this->fields[$name];
        else
            return
null;
    }
   
   
/**
     * Iterator implementation - rewind
     */
   
function rewind()
    {
       
$this->beyondLastField = false;
        return
reset($this->fields);
    }
   
    function
valid()
    {
        return !
$this->beyondLastField;
    }
   
    function
current()
    {
        return
current($this->fields);
    }
   
    function
key()
    {
        return
key($this->fields);
    }
   
    function
next()
    {
       
$next = next($this->fields);
       
$key = key($this->fields);           
        if (isset(
$key)) {
            return
$next[1];
        } else {
           
$this->beyondLastField = true;
            return
false; // doesn't matter what we return here, see valid()
       
}
    }
   
    private
$beyondLastField = false;
};

Hope this helps someone.

vaclav dot sir at gmail dot com (13-Aug-2007 05:23)

To that "note": You won't be able to distinguish the end of an array from a boolean FALSE element, BUT you can distinguish the end from a NULL value of the key() function.

Example:
<?php
if (key($array) === null) {
    echo
"You are in the end of the array.";
} else {
    echo
"Current element: " . current($array);
}
?>

marnaq (18-Aug-2006 01:20)

To make this function return a reference to the element instead, use:

<?php
function &current_by_ref(&$arr) {
    return
$arr[key($arr)];
}
?>

mdeng at kabenresearch dot com (24-Apr-2004 07:04)

For large array(my sample was 80000+ elements), if you want to traverse the array in sequence, using array index $a[$i] could be very inefficient(very slow). I had to switch to use current($a).

vitalib at 012 dot net dot il (02-Dec-2003 10:10)

Note that by copying an array its internal pointer is lost:

<?php
$myarray
= array(0=>'a', 1=>'b', 2=>'c');
next($myarray);
print_r(current($myarray));
echo
'<br>';
$a = $myarray;
print_r(current($a));
?>

Would output 'b' and then 'a' since the internal pointer wasn't copied. You can cope with that problem using references instead, like that:

<?php
$a
=& $myarray;
?>

tipman (08-May-2003 12:07)

if you got a array with number as index you get the last index with this:

eg:
$array[0] = "foo";
$array[1] = "foo2";

$lastKey = sizeof($array) - 1;

only a little help :)

retestro_REMOVE at SPAM_esperanto dot org dot il (02-Mar-2003 02:31)

The docs do not specify this, but adding to the array using the brackets syntax:
     <?php $my_array[] = $new_value; ?>
will not advance the internal pointer of the array. therefore, you cannot use current() to get the last value added or key() to get the key of the most recently added element.

You should do an end($my_array) to advance the internal pointer to the end ( as stated in one of the notes on end() ), then

    <?php
     $last_key
= key($my_array);  // will return the key
    
$last_value = current($my_array);  // will return the value
   
?>

If you have no need in the key, $last_value = end($my_array) will also do the job.

- Sergey.