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

Cli*_*ote 135 php

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

$array['foo'] = 400;
$array['bar'] = 'xyz';
Run Code Online (Sandbox Code Playgroud)

而且我想在不知道密钥的情况下从该阵列中获取第一个项目,我该怎么做?这有功能吗?

sou*_*rge 266

reset() 如果数组中有元素,则为您提供数组的第一个值:

$value = reset($array);
Run Code Online (Sandbox Code Playgroud)

它还为您FALSE提供了数组为空的情况.

  • 如果我想获取键和值怎么办? (4认同)
  • 更改数组中的指针可能会弄乱别人的代码,但.... (3认同)

Joh*_*ica 44

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

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

echo "$key = $value\n";
Run Code Online (Sandbox Code Playgroud)

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

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

echo "$key = $value\n";
Run Code Online (Sandbox Code Playgroud)

  • 重置不会返回密钥 (20认同)
  • +1 也用于假循环,我需要保留密钥,因此无法选择重置 (3认同)
  • 可能因为reset()更简单. (2认同)
  • 为“假循环” +1。我需要检索第一个元素的键和值,而不必遍历每个元素。`reset()`函数只会获取第一个值。 (2认同)
  • 假循环!这是一个聪明的小主意。谢谢! (2认同)

LSe*_*rni 35

PHP <7.3

如果你对数组知之甚少(你不确定第一个键是foo还是bar),那么数组也可能是空的.

所以最好检查一下,特别是如果返回值有可能是布尔值FALSE:

$value = empty($arr) ? $default : reset($arr);
Run Code Online (Sandbox Code Playgroud)

上述代码使用reset具有的副作用(它重置所述阵列的内部指针),因此可能更喜欢使用array_slice可以快速访问该阵列的第一个元素的副本:

$value = $default;
foreach(array_slice($arr, 0, 1) as $value);
Run Code Online (Sandbox Code Playgroud)

假设您想分别获取键和值,则需要将第四个参数添加到array_slice:

foreach(array_slice($arr, 0, 1, true) as $key => $value);
Run Code Online (Sandbox Code Playgroud)

要将第一个项目作为一对(key => value):

$item = array_slice($arr, 0, 1, true);
Run Code Online (Sandbox Code Playgroud)

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

foreach(array_slice($arr, -1, 1, true) as $key => $value);
Run Code Online (Sandbox Code Playgroud)

性能

如果数组不是很大,你实际上并不需要array_slice,而是可以获得整个键数组的副本,然后得到第一项:

$key = count($arr) ? array_keys($arr)[0] : null;
Run Code Online (Sandbox Code Playgroud)

但是,如果你有一个非常大的数组,那么调用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)];
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这是最好的答案,因为唯一一个提供键和值的未弃用的答案是中止的 foreach 循环,这很尴尬。其他答案仅给出值而没有密钥。 (3认同)
  • 为什么这个答案没有足够的支持呢? (2认同)
  • 喜欢这个答案,现代方法并随着时间的推移而更新。 (2认同)

Jer*_*ten 25

有几个选择.array_shift()将返回第一个元素,但它也将从数组中删除第一个元素.

$first = array_shift($array);
Run Code Online (Sandbox Code Playgroud)

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

$first = current($array);
Run Code Online (Sandbox Code Playgroud)

如果您想确保它指向第一个元素,您可以随时使用reset().

reset($array);
$first = current($array);
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个答案最完整,但注意`reset()`实际上返回元素,所以跟着`$ first = current($ array)`是多余的. (2认同)

cwa*_*ole 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.
Run Code Online (Sandbox Code Playgroud)

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

$arr[reset(array_keys($arr))]; // OR
reset(array_values($arr));
Run Code Online (Sandbox Code Playgroud)

好处$arr[reset(array_keys($arr))];是,如果数组实际为空,它会发出警告.


w3b*_*k3r 6

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

例如:

if(is_array($array))
{
  reset($array);
  $first = key($array);
}
Run Code Online (Sandbox Code Playgroud)


Beg*_*ner 6

另一种简单易用的方法是使用array_values

array_values($array)[0]
Run Code Online (Sandbox Code Playgroud)

  • 在 PHP 7+ 中,这样的事情会起作用:`array_values($array)[0] ?? 错误` (3认同)

eve*_*v92 5

您可以使用 array_values

$firstValue = array_values($array)[0];
Run Code Online (Sandbox Code Playgroud)