获取(可能)关联数组中的第一个键?

确定可能关联数组中的第一个键的最佳方法是什么?我的第一个想法是先访问数组,然后立即打破它,像这样:

foreach ($an_array as $key => $val) break;

因此,$key包含第一个键,但这似乎效率低下。有人有更好的解决方案吗?

639445 次浏览

array_keys返回一个键数组。取第一个条目。或者,您可以在数组上调用reset,然后调用key。后一种方法可能稍微快一点(尽管我没有测试它),但它有重置内部指针的副作用。

key($an_array)会给你第一个密钥

编辑每个Blixt:您应该在key($an_array)之前调用reset($array);来重置指向数组开头的指针。

2019更新

php7.3开始,有一个名为array_key_first()的新内置函数,它将从给定数组中检索第一个键,而无需重置内部指针。查看留档以获取更多信息。


您可以使用resetkey

reset($array);$first_key = key($array);

它基本上与您的初始代码相同,但开销较小,并且发生的事情更明显。

请记住调用reset,否则您可能会获得数组中的任何键。您也可以使用end而不是reset来获取最后一个键。

如果你想让键获得第一个值,reset实际上会返回它:

$first_value = reset($array);

不过有一个特殊情况需要注意(所以首先检查数组的长度):

$arr1 = array(false);$arr2 = array();var_dump(reset($arr1) === reset($arr2)); // bool(true)

请查找以下内容:

$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);$keys   =   array_keys($yourArray);echo "Key = ".$keys[0];

工作示例:

list($firstKey) = array_keys($yourArray);
$myArray = array(2 => '3th element',4 => 'first element',1 => 'second element',3 => '4th element');echo min(array_keys($myArray)); // return 1

这也可能是一个解决方案:

$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);$first_key = current(array_flip($yourArray));echo $first_key;

我已经测试过了,它起作用了。

工作守则

如果效率对您来说不是那么重要,您可以在PHP 5.4(及更高版本)中使用array_keys($yourArray)[0]

示例:

# 1$arr = ["my" => "test", "is" => "best"];echo array_keys($arr)[0] . "\r\n"; // prints "my"

# 2$arr = ["test", "best"];echo array_keys($arr)[0] . "\r\n"; // prints "0"
# 3$arr = [1 => "test", 2 => "best"];echo array_keys($arr)[0] . "\r\n"; // prints "1"

解决方案的优势:

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

您可以将array_keys($arr)[0]作为函数参数传递(即doSomething(array_keys($arr)[0], $otherParameter))。

HTH

有趣的是,Foreach循环实际上是最有效的方法。

由于OP特别询问了效率问题,应该指出的是,目前所有的答案实际上都比Foreach效率低得多。

我用php 5.4做了一个基准测试,重置/键指针方法(接受答案)似乎比Foreach慢7倍。其他操纵整个数组的方法(array_keys,array_flip)显然比这更慢,并且在处理大数组时变得更糟。

Foreach一点也不低效,随意使用它!

编辑2015-03-03:

Benchmark脚本已经被要求,我没有原来的脚本,但做了一些新的测试。这次我发现Foreach的速度只有复位/key的两倍。我使用了一个100键的数组,并将每个方法运行了一百万次以获得一些明显的区别,这是简单基准的代码:

$array = [];for($i=0; $i < 100; $i++)$array["key$i"] = $i;
for($i=0, $start = microtime(true); $i < 1000000; $i++) {foreach ($array as $firstKey => $firstValue) {break;}}echo "foreach to get first key and value: " . (microtime(true) - $start) . " seconds <br />";
for($i=0, $start = microtime(true); $i < 1000000; $i++) {$firstValue = reset($array);$firstKey = key($array);}echo "reset+key to get first key and value: " . (microtime(true) - $start) . " seconds <br />";
for($i=0, $start = microtime(true); $i < 1000000; $i++) {reset($array);$firstKey = key($array);}echo "reset+key to get first key: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {$firstKey = array_keys($array)[0];}echo "array_keys to get first key: " . (microtime(true) - $start) . " seconds <br />";

在我的php 5.5上输出:

foreach to get first key and value: 0.15501809120178 secondsreset+key to get first key and value: 0.29375791549683 secondsreset+key to get first key: 0.26421809196472 secondsarray_keys to get first key: 10.059751987457 seconds

重置+键http://3v4l.org/b4DrN/perf#tabs
http://3v4l.org/gRoGD/perf#tabs

 $arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');list($first_key) = each($arr);print $first_key;// key1

你可以试试

array_keys($data)[0]

一句话:

$array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');echo key( array_slice( $array, 0, 1, true ) );
# echos 'key1'

对我来说最好的办法就是

array_shift(array_keys($array))

array_keys从初始数组获取键数组,然后array_shift从它的第一个元素值中切割。为此,您需要PHP 5.4+。

你可以玩你的数组

$daysArray = array('Monday', 'Tuesday', 'Sunday');$day = current($transport); // $day = 'Monday';$day = next($transport);    // $day = 'Tuesday';$day = current($transport); // $day = 'Tuesday';$day = prev($transport);    // $day = 'Monday';$day = end($transport);     // $day = 'Sunday';$day = current($transport); // $day = 'Sunday';

要获取数组的第一个元素,您可以使用current,对于最后一个元素,您可以使用end

编辑

只是为了不得到任何更多的票的答案,你可以转换你的键使用值array_keys和使用如上所示。

这是我找到的最简单的方法。快速且只有两行代码:-D

$keys = array_keys($array);echo $array[$keys[0]];

今天我不得不搜索POST请求返回的数组的第一个键。(并注意表单id的数字等)

我找到了这个:返回PHP中关联数组的第一个键

http://php.net/key

我做了这个,它工作。

    $data = $request->request->all();dump($data);while ($test = current($data)) {dump($test);echo key($data).'<br />';die();break;}

也许它会生态15分钟的另一个人。CYA。

为了增强Webmut的解决方案,我添加了以下解决方案:

$firstKey = array_keys(array_slice($array, 0, 1, TRUE))[0];

我在PHP 7.1上的输出是:

foreach to get first key and value: 0.048566102981567 secondsreset+key to get first key and value: 0.11727809906006 secondsreset+key to get first key: 0.11707186698914 secondsarray_keys to get first key: 0.53917098045349 secondsarray_slice to get first key: 0.2494580745697 seconds

如果我对大小为10000的数组执行此操作,则结果变为

foreach to get first key and value: 0.048488140106201 secondsreset+key to get first key and value: 0.12659382820129 secondsreset+key to get first key: 0.12248802185059 secondsarray_slice to get first key: 0.25442600250244 seconds

array_keys方法在30秒内超时(只有1000个元素,其余的时间大致相同,但array_keys方法大约有7.5秒)。

2018+

从PHP 7.3开始,有一个array_key_first()函数可以实现这一点:

$array = ['foo' => 'lorem', 'bar' => 'ipsum'];$firstKey = array_key_first($array); // 'foo'

文档可用这里.😉

php73:

$array = ['a' => '..', 'b' => '..'];
array_key_first($array); // 'a'array_key_last($array); // 'b';

http://php.net/manual/en/function.array-key-first.php

使用:

$array = ['po','co','so'];
echo reset($array);

结果:po

我认为最好和最快的方法是:

$first_key=key(array_slice($array, 0, 1, TRUE))

由于PHP 7.3.0函数array_key_first()可以使用。

对于PHP 7.3.0之前的版本,有几种方法可以提供此功能。可以使用array_keys(),但这可能相当低效。也可以使用reset()key(),但这可能会更改内部数组指针。一个有效的解决方案,不更改内部数组指针,写为poly填充:

<?phpif (!function_exists('array_key_first')) {function array_key_first(array $arr) {foreach($arr as $key => $unused) {return $key;}
return null;}}?>

关于@Blixt的答案,在7.3.0之前,可以使用此Poly填充:

if (!function_exists('array_key_first')) {function array_key_first(array $array) {return key(array_slice($array, 0, 1, true));}}

这将适用于所有PHP版本

$firstKey = '' ;
//$contact7formlist - associative array.
if(function_exists('array_key_first')){    
$firstKey = array_key_first($contact7formlist);    
}else{    
foreach ($contact7formlist as $key => $contact7form ){$firstKey = $key;break;}}

array_chunk将数组拆分为块,您可以使用:

$arr = ['uno'=>'one','due'=>'two','tre'=>'three'];$firstElement = array_chunk($arr,1,true)[0];var_dump($firstElement);