PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

each> <count
Last updated: Sun, 25 Nov 2007

view this page in

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() 참고.



each> <count
Last updated: Sun, 25 Nov 2007
 
add a note add a note User Contributed Notes
current
aefxx
15-May-2008 08: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:

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
27-Feb-2008 09: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 09: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
17-Aug-2006 05: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
23-Apr-2004 11: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 02: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 04: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
01-Mar-2003 06:31
The docs do not specify this, but adding to the array using the brackets syntax:
     $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

     $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.

each> <count
Last updated: Sun, 25 Nov 2007
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites