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.
current
(PHP 4, PHP 5)
current — Bir diziden gösterici konumundaki elemanı döndürür
Açıklama
Her dizinin, ilklendirme anında ilk elemanına konumlanan bir göstericisi vardır.
Değiştirgeler
- dizi
-
Üzerinde işlem yapılacak dizi.
Dönen Değerler
current() işlevi dizinin dahili göstericinin işaret ettiği elemanı döndürür. Göstericinin yeri değiştirilmez. Eğer gösterici sonuncu elemanın sonrasını işaret ediyorsa veya dizi boşsa FALSE döner.
Bu işlev mantıksal FALSE değeriyle dönebileceği gibi FALSE olarak değerlendirilebilecek mantıksal olmayan bir değerle de dönebilir (örneğin, 0 veya ""). Bu konuda daha fazla bilgi edinmek için Mantıksal Değerler bölümüne bakabilirsiniz. Bu işlevden dönen değeri sınamak için === işlecini kullanınız.
Örnekler
Örnek 1 - current() örneği
<?php
$araç = array('tabanvay', 'bisiklet', 'otomobil', 'uçak');
$kip = current($araç); // $kip = 'tabanvay';
$kip = next($araç); // $kip = 'bisiklet';
$kip = current($araç); // $kip = 'bisiklet';
$kip = next($araç); // $kip = 'otomobil';
$kip = prev($araç); // $kip = 'bisiklet';
$kip = end($araç); // $kip = 'uçak';
$kip = current($araç); // $kip = 'uçak';
$arr = array();
var_dump(current($arr)); // bool(false)
$arr = array(array());
var_dump(current($arr)); // array(0) { }
?>
Notlar
Bilginize: Bir dizi sonunu boolean FALSE değerinden ayıramazsınız. element. FALSE değerli elemanlar içeren bir dizide bilinçli olarak ilerlemenin en doğru yolu each() kullanmaktır.
Ayrıca Bakınız
- end() - Bir dizinin dahili göstericisini sonuncu elemana konumlandırır
- key() - Bir diziden gösterici konumundaki anahtarı döndürür
- each() - Bir diziden, gösterici konumundaki anahtar değer çiftini döndürdükten sonra göstericiyi bir ilerletir
- prev() - Dahili dizi göstericisini bir geriletir
- reset() - Bir dizinin dahili göstericisini ilk elemana konumlar
- next() - Dahili dizi göstericisini bir ilerletir
current
15-May-2008 03:39
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.
13-Aug-2007 04: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);
}
?>
18-Aug-2006 12:20
To make this function return a reference to the element instead, use:
<?php
function ¤t_by_ref(&$arr) {
return $arr[key($arr)];
}
?>
24-Apr-2004 06: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).
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;
?>
08-May-2003 11: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 :)
02-Mar-2003 02: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.
