PHP 大会日本 2024

current

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

current返回数组中的当前元素

描述

current(数组|对象 $array): 混合

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

参数

array

数组。

返回值

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

警告

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

变更日志

版本 描述
8.1.0 对象 调用此函数已弃用。请先使用 get_mangled_object_vars()对象 转换为 数组,或者改用实现 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() 的结果与 布尔值 false 元素的结果无法区分。要正确遍历可能包含 false 元素的数组,请参阅 foreach 控制结构。 要继续使用 current() 并正确检查该值是否确实是数组的元素,则应检查 current() 元素的 key() 是否严格不同于 null

参见

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

添加注释

用户贡献的注释 13 条注释

sergey dot karavay at gmail dot com
3 年前
看起来 `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
11 年前
注意,您可以通过表达式传递数组,而不仅仅是通过引用(如文档中所述)。

<?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)
10年前
如果在 foreach 语句中使用 unset() 后使用 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
5年前
数组可以通过引用和表达式传递给 `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
21年前
请注意,复制数组会丢失其内部指针。

<?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,我想补充以下内容。正如 Vasily 在他的示例中指出的那样
<?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 及更高版本中不存在。
另一种解决方法(至少从 Vasily 的示例来看)是在使用 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,则表示您已超出数组的末尾——数组中的键不能为 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 函数重新排序树。
To Top