获取数组的第一个元素。

1323

我有一个数组:

array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )

我想要获取这个数组的第一个元素。期望结果是:string apple

一个要求:不能使用引用传递,因此array_shift不是一个好的解决方案。

我该怎么做?


1
什么意思,不能通过引用来完成? - cjk
4
我怀疑你所谓的“不能通过引用完成”的真正意思是,你的数组是动态从数据库返回的,而且在取第一个元素之前不想将数组传递到变量中。如果我理解正确,那么下面提供给你的大多数解决方案(包括被接受的答案)都是不够的。 - cartbeforehorse
1
您只需要获取它还是获取并从现有数组中删除它? - Jo Smo
关于数组的基本使用,您可以查看此链接http://www.technofusions.com/introduction-to-arrays-in-php/。 - Vikrant Vir Bhalla
@ray 我们不需要在每个PHP问题的标题中添加“PHP” -- 这就是[tag:php]标签的作用。 - mickmackusa
显示剩余4条评论
39个回答

1647

原回答,但代价高昂(O(n)):

array_shift(array_values($array));

在O(1)时间复杂度内:
array_pop(array_reverse($array));

其他用途等

如果修改(重置数组指针的意义下)$array不是问题,您可以使用以下方法:

reset($array);

如果需要进行数组“复制”,这理论上应该更加高效:

array_shift(array_slice($array, 0, 1));

使用PHP 5.4+(但如果为空可能会导致索引错误):

array_values($array)[0];

86
感谢夸奖聪明的解决方法,使用array_values()避免修改原始数组。 - ChrisR
54
我得到了这个:<b>严格标准</b>:只有变量应该通过引用传递。顺便说一句,不错的解决方法。 - Simone
207
这不是有些过度了吗?如果数组包含数千个元素,那怎么办?为了获取第一个元素而创建一个全新的数组是否合理?我认为“list()”和“reset()”是更好的解决方案。 - Martin Dimitrov
40
我同意。与仅重置并返回当前值的一行代码相比,这是完全过度并需要极大的资源:reset($array)。 - zmonteca
51
就像上面评论者所说的一样,这让我感到困惑,不理解为什么会有101个赞。 - Lightness Races in Orbit
显示剩余28条评论

895
正如Mike所指出的(最简单的方法):
$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($arr); // Echoes "apple"

如果你想获取钥匙:(在重置后执行)
echo key($arr); // Echoes "4"

PHP文档中:

mixed reset ( array | object &$array );

描述:

reset()数组的内部指针倒回到第一个元素,并返回第一个数组元素的值,如果数组为空,则返回FALSE。


18
数组的迭代器被修改了。如果你在foreach循环中对该数组进行此操作,它将被破坏。 - Zenexer
2
@Zenexer 这并不总是(通常)正确的。在实践中,foreach 通常会复制它遍历的数组。 - Luke Cousins
1
@Angger 在重置后,您可以调用 key($arr),然后您将获得 '4'(添加到答案中)。 - lepe
9
@Zenexer和Luke Cousins都不正确: 1)foreach不使用数组的内部指针 - 相反,它会创建自己的指针。通过在foreach中调用reset进行检查很容易 - 循环将不受reset()的影响而继续进行。 2)不,foreach不会创建数组的副本!它只会创建它自己的指针(甚至不是现有指针的副本 - 这也很容易检查,在foreach之前调用next())。 - dmikam
1
@Zenexer 嗯,你不必相信我的话 :) 这篇帖子中已经很好地描述了它:https://dev59.com/Wmkw5IYBdhLWcg3wNX32#14854568 - dmikam
显示剩余5条评论

318
$first_value = reset($array); // First element's value
$first_key = key($array); // First element's key

2
我实际上还没有测试过它,但似乎这种方法是最有效的。 - mason81
4
唯一的问题是问题要求的是值,而不是键。因此应该使用current($array),而不是key($array)。 - zmonteca
4
@zmonteca $first_value = reset($array);这段代码会获取数组的第一个元素值,reset()函数会将数组内部指针重置为第一个元素并返回该元素的值。 - S3Mi
2
最佳答案!我正在寻找key()等价物来获取第一个值。这很有帮助! - Alain Tiemblo
2
如果数组为空怎么办?reset()将返回false,如果您期望数组包含布尔值,则可能会导致错误。 - Jacob

159

current($array)

返回数组的第一个元素,根据PHP手册

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

因此,它在您重新定位数组指针之前有效,否则您将不得不使用reset(),它将倒回数组并返回数组的第一个元素

根据PHP手册reset

reset()将数组的内部指针倒回到第一个元素,并返回第一个数组元素的值。

current()reset()的示例

$array = array('step one', 'step two', 'step three', 'step four');

// by default, the pointer is on the first element
echo current($array) . "<br />\n"; // "step one"

//Forward the array pointer and then reset it

// skip two steps
next($array);
next($array);
echo current($array) . "<br />\n"; // "step three"

// reset pointer, start again on step one
echo reset($array) . "<br />\n"; // "step one"

8
我不知道为什么这个答案没有被采纳,它相当简单和准确地回答了问题。 - relipse
31
只有当数组指针“当前”指向第一个元素时,current($array)才能起作用,否则需要使用reset($array) - Jon
7
似乎current()现在不再需要一个引用作为参数,尽管PHP文档没有反映这一点。因此我认为这已经成为了最佳解决方案。 - Ryan
@Ryan同意,但是这个解决方案是在2014年之前的2年里在同一线程的另一个答案中提供的...奇怪的是这个不完整的句子得到了更多的赞。 - CPHPython
如果数组为空怎么办?reset()current()将返回false,如果您期望数组包含bool值,则可能会导致错误。 - Jacob
因地制宜。如果你有一个数组变量,就用reset()。当嵌套函数时,例如current(array_column([],'key')),使用current() - Jono

116
$arr = $array = array( 9 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($arr); // echoes 'apple'

如果您不想丢失当前指针位置,只需为数组创建一个别名。


1
不好意思,我没听懂,你是什么意思?只要第一个键大于其他键,它就能正常工作。 - yoda
30
+1 FYI reset() 已经返回了第一个元素,所以不需要使用 current() -- echo reset($arr) 就足够了。 - Mike
@Mike,你可能更喜欢使用current而不是reset,以避免在引用情况下产生PHP通知/错误,例如在3v4l中的current(array_filter(...)); - CPHPython
1
如果数组为空怎么办?reset()将返回false,如果您期望数组包含bool值,则可能会导致错误。 - Jacob

92

PHP 7.3 新增了两个函数,可以直接获取数组的第一个和最后一个键名,无需修改原始数组,也不需要创建任何临时对象:

除了语义上有意义外,这些函数甚至不会移动数组指针(就像foreach一样)。

有了键名,就可以直接使用它们获取相应的值。


示例(所有示例都需要 PHP 7.3 或更高版本)

获取第一个/最后一个键名和对应的值:

$my_array = ['IT', 'rules', 'the', 'world'];

$first_key = array_key_first($my_array);
$first_value = $my_array[$first_key];

$last_key = array_key_last($my_array);
$last_value = $my_array[$last_key];

获取数组的第一个/最后一个值,假设数组不为空

$first_value = $my_array[ array_key_first($my_array) ];

$last_value = $my_array[ array_key_last($my_array) ];

一行代码获取空数组的第一个/最后一个值,并设置默认值:

$first_value = empty($my_array) ? 'default' : $my_array[ array_key_first($my_array) ];

$last_value = empty($my_array) ? 'default' : $my_array[ array_key_last($my_array) ];

4
使用 null 合并运算符 进行简化,通常 null 是默认值,因此代码如下:$first_value = $my_array[array_key_first($my_array)] ?? null; - Mitchell McKenna
2
从PHP 7.3开始,这应该是被选中的答案。 - Xavi Montero
他们也应该添加array_first。来获取第一个项目。还有可能是array_second ;) - PeterM

76
您可以使用语言结构“list”获取第N个元素:
// First item
list($firstItem) = $yourArray;

// First item from an array that is returned from a function
list($firstItem) = functionThatReturnsArray();

// Second item
list( , $secondItem) = $yourArray;

使用array_keys函数,您可以对键执行相同的操作:

list($firstKey) = array_keys($yourArray);
list(, $secondKey) = array_keys($yourArray);

2
这正是我所做的:list($first_value) = $my_array; 在我看来,这是最好的选择。它没有其他答案中存在的问题:不会“过度设计”,因为它既不复制数组也不创建新数组。没有“引用”:数组不会被修改。没有“重置”:不会更改数组内部指针... - J. Bruni
7
非常优雅的解决方案,但当数组为空时会抛出E_NOTICE错误。 - Tgr
17
这不对吗?它只适用于数组键为int的情况,请尝试执行list($firstItem) = array('key1' => 'value1');,你会收到一个错误提示Notice: Undefined offset: 0 - Marco Demaio
2
@Sergiy 但这样就失去了此解决方案的最大优势,即不需要将整个原始数组复制到另一个数组中。尽管如此,如果您可以保证是一个整数索引数组,仍然有益处,给你点赞。 - Jeff Lambert
12
澄清一下:“list($x) = foo();”等同于“$x = foo()[0];”。请注意,这不一定与“获取第一个项目”相同,因为即使是基于整数索引的数组,也可能没有具有键0的元素。在我的情况下,我正在执行“list($order) = get_order($user);”,但“get_order”返回按其ID键入的订单,其键通常不为0。正如@Sergiy所说,array_values()可以解决这个问题,但会降低代码的效率和(更重要的是)可读性。 - Warbo
显示剩余3条评论

56

PHP 5.4+:

array_values($array)[0];

4
他在2013年10月编辑了他的回答,加入了我在四月份添加的回答。 - Samer Ata
PHP 4:$array_values = array_values($array); $value = $array_values[0];PHP 4:$array_values = array_values($array); $value = $array_values[0]; - zdick
如果数组为空,它将返回“undefined key 0”,因此请谨慎使用。 - Andrea Mauro

28

假设:

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

只需使用:

$array[key($array)]

获取第一个元素或

key($array)
获取第一个键值。
如果您想要删除它,可以取消链接第一个键。

10
那为什么不直接使用“current”呢? - Marco Demaio

28

有些数组不能与像listresetcurrent这样的函数一起使用。也许它们是“伪”数组-例如部分实现了ArrayIterator。

如果你想无论何种类型的数组都要获取第一个值,可以通过短路迭代器来实现:

foreach($array_with_unknown_keys as $value) break;

在这种方式下,你的值将会在$value中被获取,并且循环在第一次迭代后就会终止。这比将一个可能很大的数组复制到像array_unshift(array_values($arr))这样的函数中更加高效。

你也可以通过以下方式获取键:

foreach($array_with_unknown_keys as $key=>$value) break;

如果您正在从函数中调用此函数,请尽早返回:

function grab_first($arr) {
    foreach($arr as $value) return $value;
}

我认为这是其中一种最快的方法,因为使用语言结构foreach而不是函数调用(更昂贵)。http://www.designcise.com/web/tutorial/how-to-get-the-first-element-of-an-array-in-php - Ildar Amankulov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接