current

(PHP 4, PHP 5, PHP 7, PHP 8)

current返回数组中的当前元素

说明

current(array|object $array): mixed

每个数组都有一个指向其“当前”元素的内部指针,该指针初始化为插入数组的第一个元素。

参数

array

数组。

返回值

current() 函数只是返回当前由内部指针指向的数组元素的值。它不会以任何方式移动指针。如果内部指针指向元素列表的末尾或数组为空,则 current() 返回 false

警告

此函数可能会返回布尔值 false,但也会返回计算为 false 的非布尔值。有关更多信息,请阅读有关 布尔值 的部分。使用 === 运算符 来测试此函数的返回值。

变更日志

版本 说明
8.1.0 object 上调用此函数已弃用。您可以先使用 get_mangled_object_vars()object 转换为 array,或者改用实现 Iterator 的类的提供的方法,例如 ArrayIterator
7.4.0 SPL 类的实例现在被视为没有属性的空对象,而不是调用与该函数同名的 Iterator 方法。

示例

示例 #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';

$arr = array();
var_dump(current($arr)); // bool(false)

$arr = array(array());
var_dump(current($arr)); // array(0) { }
?>

注释

注意: 在空数组和内部指针指向元素末尾的数组上调用 current() 的结果与 bool false 元素是无法区分的。要正确遍历可能包含 false 元素的数组,请参阅 foreach 控制结构。 要继续使用 current() 并正确检查该值是否真的是数组中的元素,应该检查 key()current() 元素是否严格不同于 null

参见

  • end() - 将数组的内部指针设置为其最后一个元素
  • key() - 从数组中获取键
  • each() - 返回数组中的当前键值对并前进数组光标
  • prev() - 倒回内部数组指针
  • reset() - 将数组的内部指针设置为其第一个元素
  • next() - 前进数组的内部指针
  • foreach

添加注释

用户贡献的注释 15 则

sergey dot karavay at gmail dot com
2 年前
看起来 `current()` 从 PHP 7.4 开始在对象上调用已弃用。

考虑以下代码

```
$a = new ArrayIterator([1,2,3]);

var_dump(current($a), $a->current());
```

它返回
```
int(1)
int(1)
```

在 PHP 7.3 中,但在 PHP7.4 中您将获得
```
bool(false)
int(1)
```

以及在 PHP8 中
```
已弃用:current():在 /in/fdrNR 的第 5 行调用对象上的 current() 已弃用
bool(false)
int(1)
```
michael at squiloople dot com
12 年前
current() 也适用于对象

<?php

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

?>
strate at yandex dot com
10 年前
请注意,您可以通过表达式传递数组,而不仅仅是通过引用(如文档中所述)。

<?php
var_dump
( current( array(1,2,3) ) ); // (int) 1
?>
vaclav dot sir at gmail dot com
17 年前
关于该“注释”:您将无法区分数组的末尾和布尔值 FALSE 元素,但您可以区分末尾和 key() 函数的 NULL 值。

示例
<?php
if (key($array) === null) {
echo
"您已到达数组的末尾。";
} else {
echo
"当前元素: " . current($array);
}
?>
retestro_REMOVE at SPAM_esperanto dot org dot il
21 年前
文档没有指定这一点,但使用方括号语法向数组添加元素
<?php $my_array[] = $new_value; ?>
不会前进数组的内部指针。因此,您无法使用 current() 获取添加的最后一个值或使用 key() 获取最近添加元素的键。

您应该执行 end($my_array) 以将内部指针前进到末尾(如 end() 的其中一个注释中所述),然后

<?php
$last_key
= key($my_array); // 返回键
$last_value = current($my_array); // 返回值
?>

如果你不需要键,$last_value = end($my_array) 也可以完成这项工作。

- Sergey。
mdeng at kabenresearch dot com
20 年前
对于大型数组(我的样本有 80000 多个元素),如果你想按顺序遍历数组,使用数组索引 $a[$i] 可能会非常低效(非常慢)。我不得不改用 current($a)。
Vasily Yudin (st-2 at mail dot ru)
9 年前
如果你在 foreach 语句中使用 uset() 后使用 current(),你可能会在 PHP 5.2.4 及以上版本中得到 FALSE。
这里有一个例子
<?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)
?>
如果你在不使用 foreach 的情况下使用 unset(),一切都会正常。
<?php
$prices
= array(
0 => '1300990',
1 => '500',
2 => '600'
);
unset(
$prices[1]);
unset(
$prices[2]);

var_dump(current($prices));
?>
leozmm at outlook dot com
4 年前
数组可以通过 `current` 的引用和表达式传递,因为 current 不会移动数组的内部指针。
这对于其他函数(如:`end`、`next`、`prev` 等)并不适用。

<?php
function foo() {return array(1,2,3);}
echo
current(foo()); // 输出 '1'
echo end(foo()); // 输出错误:只能通过引用传递变量
?>
xedin dot unknown at gmail dot com
6 年前
数组函数,如 `current()` 和 `rewind()` 也可以在 `Traversable` 上工作,PHP 5.0 - 7.3,但 HHVM 不行。

<?php

$queue
= new ArrayIterator(array('adasdasd'));
reset($queue);
$current = current($queue);
var_dump($current);

?>

参见 https://3v4l.org/VjCHR
vitalib at 012 dot net dot il
20 年前
请注意,通过复制数组,它的内部指针会丢失

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

会输出 'b' 然后 'a',因为内部指针没有被复制。你可以使用引用来解决这个问题,比如这样

<?php
$a
=& $myarray;
?>
pdarmis at gmail dot com
7 年前
基于这个例子 https://php.net/manual/en/function.current.php#116128 我想补充以下内容。正如瓦西里在他的例子中指出的
<?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)
?>
上面的例子在 PHP 5.2.4 到 5.6.29 版本之间不会起作用,并返回 false。这个问题在 PHP 7.0.1 及以上版本中不存在。
另一种解决方法(至少来自瓦西里的例子)是在使用 current() 之前使用 reset(),以便将数组指针重置到开头。
<?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"
?>
gregory at gregory dot net
16 年前
我花了一段时间才弄明白,但有一个更一致的方法来判断你是否真的走过了数组的末尾,而不是使用 each()。

你看,each() 在前进指针之前获取值,next() 在前进指针之后获取值。因此,当你在实现 Iterator 接口时,使用 each() 真的很痛苦。

因此,我给你解决方案
要查看你是否已经超过了数组的末尾,使用 key($array) 并查看它是否返回 NULL。如果是,你就超过了数组的末尾——数组中的键不能为 null。

很巧妙吧?以下是我在一个类中实现 Iterator 接口的方式

<?php

/**
* DbRow 文件
* @package PalDb
*/

/**
* 此类允许您使用 Db 行和对象关系映射功能。
*/

class DbRow implements Iterator
{
/**
* 通过 fetchDbRows 获取此行的 DbResult 对象
* @var DbResult
*/
protected $result;

/**
* 行的字段
* @var $fields
*/
protected $fields;

/**
* 构造函数
*
* @param PDOStatement $stmt
* 此结果使用的 PDO 语句对象
* @param DbResult $result
* 通过 fetchDbRows 生成此行的结果
*/
function __construct($result)
{
$this->result = $result;
}

/**
* 获取通过 fetchDbRows 获取此行的 DbResult 对象
* @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 实现 - 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; // 无论我们在这里返回什么,请参见 valid()。
}
}

private
$beyondLastField = false;
};

希望这对某些人有所帮助.
Pratip Ghosh
10 年前
如果我们从数组中取消设置任何元素,然后尝试 current 函数,我注意到它返回 FALSE。 为了克服此限制,您可以使用 array_values 函数重新排序树。
aefxx
16 年前
一个简单的复制函数,它不仅复制给定的数组,还确保副本的指针设置在完全相同的位置

<?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;
}
?>

就这样... 再见。
jodevweb at gmail dot com
7 年前
正如 Sergey 很久以前在这些笔记中提到的,当使用方括号语法添加到数组时,current 不会返回最后添加的值。 而不是使用 end() 移动指针,您可以简单地使用 <?php $my_array[count($my_array) - 1] ?> 获取最后一个值(仅适用于非关联数组)。
To Top