如何从关联的PHP数组中获取第一项?


146

如果我有一个像这样的数组:

$array['foo'] = 400;
$array['bar'] = 'xyz';

我想在不知道键的情况下从该数组中取出第一项,我该怎么做?有这个功能吗?


(参考) 数组数组函数
Gordon

Answers:



51

PHP <7.3

如果您对数组不够了解(不确定第一个键是foo还是bar),那么数组也可能是empty

因此,最好进行检查,尤其是如果返回的值可能是布尔值FALSE时,尤其如此:

$value = empty($arr) ? $default : reset($arr);

上面的代码使用reset,因此具有副作用(它会重置数组的内部指针),因此您可能更喜欢使用array_slice来快速访问数组的第一个元素的副本:

$value = $default;
foreach(array_slice($arr, 0, 1) as $value);

假设要分别获取键和值,则需要向第四个参数添加array_slice

foreach(array_slice($arr, 0, 1, true) as $key => $value);

配对获得第一项(key => value):

$item = array_slice($arr, 0, 1, true);

简单修改即可分别获取最后一项,键和值:

foreach(array_slice($arr, -1, 1, true) as $key => $value);

性能

如果数组不是真的很大,您实际上并不需要array_slice,而是可以获取整个keys数组的副本,然后获取第一项:

$key = count($arr) ? array_keys($arr)[0] : null;

但是,如果您有一个非常大的数组,则对to的调用array_keys将需要更多的时间和内存array_slice(两个函数都遍历该数组,但是后者在收集到所需数量的项后立即终止-这是一个)。

一个显着的例外是,当您拥有第一个关键点时,该关键点指向了一个非常大且复杂的对象。在这种情况下,array_slice将复制第一个大对象,而array_keys仅获取键。

PHP 7.3

PHP 7.3 array_key_first()以及都实现了array_key_last()。明确提供这些参数是为了有效地访问第一个和最后一个键,而不会由于副作用而重置阵列的内部状态。

因此,在PHP 7.3的第一个$array可访问

$array[array_key_first($array)];

您仍然最好检查一下数组是否为空,否则会出现错误:

$firstKey = array_key_first($array);
if (null === $firstKey) {
    $value = "Array is empty"; // An error should be handled here
} else {
    $value = $array[$firstKey];
}

@AhmedShefeer很好,另一个答案不仅是公认的答案,而且已经存在了八年。我有点在这里捡碎屑:-D。但是,感谢您的信任投票!
LSerni

1
在我看来,这是最好的答案,因为同时给出键和值的唯一另一个不建议使用的方法是中止的foreach循环,这很尴尬。其他答案仅给出不带键的值。
sootsnoot

1
喜欢这种现代的方式并随着时间的推移而更新。
sanjeet bisht

@LSerni不知道您是否仍处于活动状态,但是我被困住了,这篇经过充分解释和更新的帖子救了我。谢谢
izk

@izk我一直都很活跃!:-D
LSerni

44

假循环在第一次迭代时中断:

$key = $value = NULL;
foreach ($array as $key => $value) {
    break;
}

echo "$key = $value\n";

或使用each()警告: 自PHP 7.2.0起不推荐使用):

reset($array);
list($key, $value) = each($array);

echo "$key = $value\n";

2
可能是因为reset()更简单。
mjs

1
因为解决方案在您的第一行代码中,但是您仍在继续编写另一行完全不需要的行。
markus

21
重置不会返回密钥
HarryFink

3
为“假循环” +1。我需要检索第一个元素的键和值,而不必遍历每个元素。该reset()函数将仅检索第一个值。
菲尔·克罗斯

2
假循环也需要+1,我需要保留密钥,因此重置不是一种选择
isJustMe 2014年

25

有一些选择。array_shift()将返回第一个元素,但也会从数组中删除第一个元素。

$first = array_shift($array);

current() 将返回其内部内存指针指向的数组的值,默认情况下是第一个元素。

$first = current($array);

如果要确保它指向第一个元素,则可以始终使用reset()

reset($array);
$first = current($array);

3
我最喜欢这个答案,但请注意reset()实际上返回了元素,因此在后面加上a $first = current($array)是多余的。
Tom Auger

9

只是为了让我们有其他选择:reset($arr);如果您不尝试将数组指针保持在适当的位置就足够了,并且对于非常大的数组,它只需很少的开销。也就是说,它存在一些问题:

$arr = array(1,2);
current($arr); // 1
next($arr);    // 2
current($arr); // 2
reset($arr);   // 1
current($arr); // 1 !This was 2 before! We've changed the array's pointer.

在不更改指针的情况下执行此操作的方法:

$arr[reset(array_keys($arr))]; // OR
reset(array_values($arr));

这样做的好处$arr[reset(array_keys($arr))];是,如果数组实际为空,则会发出警告。


描述性的答案,对其他人来说意义重大。谢啦。
Jigar7521

7

另一种简便的方法是使用array_values

array_values($array)[0]

reset()是更好的选择,因为如果数组为空,则返回false。例如,您的解决方案在以下问题中
不起作用

1
在PHP 7+中,类似的方法将起作用:array_values($array)[0] ?? FALSE
MarthyM '18

4

在获取第一个元素之前,测试a变量是否为数组。动态创建数组(如果将其设置为null时)会出现错误。

例如:

if(is_array($array))
{
  reset($array);
  $first = key($array);
}

3

我们可以做的 $first = reset($array);

代替

reset($array);
$first = current($array);

reset()

重置后返回数组的第一个元素;


2

你(们)能做到:

$values = array_values($array);
echo $values[0];


2

你可以试试看

获取数组的第一个值:

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   var_dump(current($large_array));
?>

获取数组的第一个键

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   $large_array_keys = array_keys($large_array);
   var_dump(array_shift($large_array_keys));
?>


1

我这样做是为了获得第一个和最后一个值。这也适用于更多值。

$a = array(
    'foo' => 400,
    'bar' => 'xyz',
);
$first = current($a);   //400
$last = end($a);    //xyz

这仅在内部指针位于第一个元素时有效。尽管这样做很不错,因为它不会重置指针的位置,但仅在指针已经静止时才起作用。
cjc '18 -10-10

1

PHP 7.3.0开始,无需重置内部指针就可以做到。您将使用array_key_first。如果确定数组中包含值,则可以执行以下操作:

$first = $array[array_key_first($array)];

您更有可能要处理数组为空的情况:

$first = (empty($array)) ? $default : $array[array_key_first($array)];

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.