current() also works on objects:
<?php
echo current((object) array('one', 'two')); // Outputs: one
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
current — Devuelve el elemento actual del array
Cada array mantiene un puntero interno, que se inicializa cuando se inserta el primer elemento en el array.
array
El array.
current() solo devuelve
el elemento actual apuntado por el puntero interno del
array array
.
current() no desplaza el puntero.
Si el puntero está más allá del último elemento de la lista,
current() devuelve false
.
Esta función puede retornar false
, pero también puede retornar un valor equivalente a false
.
Por favor, lea la sección sobre los booleanos para más información.
Utilice el operador ===
para probar el valor de retorno exacto de esta función.
Versión | Descripción |
---|---|
8.1.0 | O bien convertir el objeto en un array utilizando get_mangled_object_vars() primero, o utilizar los métodos proporcionados por una clase que implemente Iterator, tal como ArrayIterator. |
7.4.0 | A partir de PHP 7.4.0, las instancias de clases SPL son tratadas como objetos vacíos sin propiedades en lugar de llamar al método Iterator con el mismo nombre que esta función. |
Ejemplo #1 Ejemplo de uso de current()
<?php
echo $mode = current($transport), PHP_EOL; // $mode = 'foot';
echo $mode = next($transport), PHP_EOL; // $mode = 'bike';
echo $mode = current($transport), PHP_EOL; // $mode = 'bike';
echo $mode = prev($transport), PHP_EOL; // $mode = 'foot';
echo $mode = end($transport), PHP_EOL; // $mode = 'plane';
echo $mode = current($transport), PHP_EOL; // $mode = 'plane';
$arr = array();
var_dump(current($arr)); // bool(false)
$arr = array(array());
var_dump(current($arr)); // array(0) { }
?>
Nota: No es posible distinguir el final de un array o el resultado de la llamada current() sobre un array vacío, a partir del elemento bool
false
. Para recorrer correctamente un array que puede contener el elementofalse
, ver la estructura de controlforeach
. Para seguir utilizando current() y verificar correctamente si el valor es realmente un elemento del array, la key() del elemento current() debería compararse estrictamente diferente del elementonull
.
foreach
current() also works on objects:
<?php
echo current((object) array('one', 'two')); // Outputs: one
?>
It looks like `current()` is deprectated for calling on objects since PHP 7.4.
Consider this code
```
$a = new ArrayIterator([1,2,3]);
var_dump(current($a), $a->current());
```
It returns
```
int(1)
int(1)
```
In PHP 7.3, but in PHP7.4 you get:
```
bool(false)
int(1)
```
And in PHP8:
```
Deprecated: current(): Calling current() on an object is deprecated in /in/fdrNR on line 5
bool(false)
int(1)
```
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);
}
?>
Note, that you can pass array by expression, not only by reference (as described in doc).
<?php
var_dump( current( array(1,2,3) ) ); // (int) 1
?>
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.
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).
Array functions, such as `current()` and `rewind()` will work on `Traversable` as well, PHP 5.0 - 7.3, but not in HHVM:
<?php
$queue = new ArrayIterator(array('adasdasd'));
reset($queue);
$current = current($queue);
var_dump($current);
?>
See https://3v4l.org/VjCHR
If you do current() after using uset() on foreach statement, you can get FALSE in PHP version 5.2.4 and above.
There is example:
<?php
$prices = array(
0 => '1300990',
1 => '500',
2 => '600'
);
foreach($prices as $key => $price){
if($price < 1000){
unset($prices[$key]);
}
}
var_dump(current($prices)); // bool(false)
?>
If you do unset() without foreach? all will be fine.
<?php
$prices = array(
0 => '1300990',
1 => '500',
2 => '600'
);
unset($prices[1]);
unset($prices[2]);
var_dump(current($prices));
?>
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;
?>
Array can be passed by both REFERENCE and EXPRESSION on `current`, because current doesn't move array's internal pointer,
this is not true for other functions like: `end`, `next`, `prev` etc.
<?php
function foo() {return array(1,2,3);}
echo current(foo()); // this print '1'
echo end(foo()); // this print error: Only variables should be passed by reference
?>
Based on this example http://php.net/manual/en/function.current.php#116128 i would like to add the following. As Vasily points out in his example
<?php
$prices = array(
0 => '1300990',
1 => '500',
2 => '600'
);
foreach($prices as $key => $price){
if($price < 1000){
unset($prices[$key]);
}
}
var_dump(current($prices)); // bool(false)
?>
The above example will not work and return false for version of PHP between 5.2.4 and 5.6.29. The issue is not present on PHP versions >= 7.0.1
A different workaround (at least from Vasily's example) would be to use reset() before using current() in order to reset the array pointer to start.
<?php
$prices = array(
0 => '1300990',
1 => '500',
2 => '600'
);
foreach($prices as $key => $price){
if($price < 1000){
unset($prices[$key]);
}
}
reset($prices);
var_dump(current($prices)); // string(7) "1300990"
?>