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

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

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

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

您可以使用resetkey

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

它基本上和你的初始代码一样,但是开销less一点,而且更明显的是发生了什么。

只要记得调用reset ,或者你可以得到数组中的任何键。 您也可以使用end而不是reset来获取最后一个键。

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

 $first_value = reset($array); 

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

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

array_keys返回一个键数组。 拿第一个入口。 或者,您可以调用arrays上的reset ,然后key 。 后一种方法可能稍微快一点(虽然我没有testing它),但是它具有重置内部指针的副作用。

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

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

我用php 5.4做了一个基准testing,重置/键指针方法(接受的答案)似乎比foreach慢大约7倍。 操纵整个数组的其他方法(array_keys,array_flip)显然比这个更慢,而且在使用大型数组的时候会变得更糟糕。

Foreach不是没有效率的,随意使用它!

编辑2015-03-03:

基准脚本已经被要求,我没有原始的脚本,而是做了一些新的testing。 这次我发现这个foreach只有reset / 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 seconds reset+key to get first key and value: 0.29375791549683 seconds reset+key to get first key: 0.26421809196472 seconds array_keys to get first key: 10.059751987457 seconds 

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

key($an_array)会给你第一个键

编辑每个Blixt:你应该调用reset($array); 之前key($an_array)将指针重置为数组的开始。

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

如果效率对你来说不重要,你可以在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" 

解决scheme的优势在于:

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

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

HTH

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

请find以下内容:

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

我认为这将工作。

这也可能是一个解决scheme。

 $first_key = current(array_flip($array)); 

我已经testing过它,它的工作原理。

你可以试试

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

为我工作的最好方法是

 array_shift(array_keys($array)) 

array_keys从初始数组中获取键的数组,然后array_shift从它的第一个元素值中array_shift 。 你将需要PHP 5.4以上。

你可以玩你的arrays

 $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和for last元素来end

单线:

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

你可以试试这个 要获得数组的第一个值:

 <?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)); ?> 

这是我find的更简单的方法。 快速,只有两行代码:-D

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

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

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

我在PHP 7.1上的输出是:

 foreach to get first key and value: 0.048566102981567 seconds reset+key to get first key and value: 0.11727809906006 seconds reset+key to get first key: 0.11707186698914 seconds array_keys to get first key: 0.53917098045349 seconds array_slice to get first key: 0.2494580745697 seconds 

如果我这样做了一个大小为10000的数组,那么结果就变成了

 foreach to get first key and value: 0.048488140106201 seconds reset+key to get first key and value: 0.12659382820129 seconds reset+key to get first key: 0.12248802185059 seconds array_slice to get first key: 0.25442600250244 seconds 

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

今天,我不得不寻找由POST请求返回的数组的第一个键。 (并注意表单编号等)

那么,我已经find了这个: 在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。