如果我有一个这样的数组:
$array['foo'] = 400;
$array['bar'] = 'xyz';
我想在不知道键值的情况下从数组中取出第一项,该怎么做呢?有这个函数吗?
如果我有一个这样的数组:
$array['foo'] = 400;
$array['bar'] = 'xyz';
我想在不知道键值的情况下从数组中取出第一项,该怎么做呢?有这个函数吗?
当前回答
PHP < 7.3
如果你对数组不够了解(你不确定第一个键是foo还是bar),那么数组也可能是空的。
所以最好检查一下,特别是如果返回值可能是布尔值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;
但是,如果您有一个非常大的数组,那么调用array_keys将需要比array_slice更多的时间和内存(两个函数都遍历数组,但后者在收集了所需数量的项(即1)后立即终止)。
一个明显的例外是当你有第一个键指向一个非常大和复杂的对象。在这种情况下,array_slice将复制第一个大对象,而array_keys将只获取键。
PHP 7 +
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];
}
其他回答
这样我们就有了其他选项: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))]];它会在数组为空时发出警告。
使用reset()函数从数组中获取第一项,而不需要知道它的键,如下所示。
$value = array('foo' => 400, 'bar' => 'xyz'); 回声重置价值(美元);
/ /输出 400
一句话:
$array['foo'] = 400;
$array['bar'] = 'xyz';
echo 'First value= ' . $array[array_keys($array)[0]];
扩展:
$keys = array_keys($array);
$key = $keys[0];
$value = $array[$key];
echo 'First value = ' . $value;
你可以使用array_values
$firstValue = array_values($array)[0];
我们可以 $first =重置($array);
而不是
reset($array);
$first = current($array);
重置()
返回重置后数组的第一个元素;