确定可能关联数组中第一个键的最佳方法是什么?我首先想到它只是预先排好阵列,然后立即打破它,就像这样:
foreach ($an_array as $key => $val) break;
因此让$ key包含第一个键,但这似乎效率低下。有没有人有更好的解决方案?
答案 0 :(得分:1256)
从 PHP 7.3 开始,有一个名为array_key_first()
的新内置函数,它将从给定数组中检索第一个键而不重置内部指针。查看documentation了解详情。
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)
答案 1 :(得分:73)
array_keys
返回一组键。拿第一个条目。或者,您可以在阵列上调用reset
,然后调用key
。后一种方法可能稍快一点(但我没有测试它),但它有重置内部指针的副作用。
答案 2 :(得分:51)
有趣的是,foreach循环实际上是最有效的方法。
由于OP专门询问了效率,因此应该指出的是,目前所有答案的效率都远远低于foreach。
我使用php 5.4对此进行了基准测试,并且重置/键指针方法(接受的答案)似乎比foreach慢约7倍。操作整个数组的其他方法(array_keys,array_flip)显然比这慢,并且在处理大数组时会变得多更差。
Foreach效率不高,随意使用它!
编辑2015-03-03:
已经请求了基准脚本,我没有原始脚本,而是进行了一些新的测试。这次我发现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
答案 3 :(得分:36)
key($an_array)
将为您提供第一个密钥
每个Blixt编辑:你应该在reset($array);
之前调用key($an_array)
来重置指向数组开头的指针。
答案 4 :(得分:22)
你可以尝试
array_keys($data)[0]
答案 5 :(得分:21)
list($firstKey) = array_keys($yourArray);
答案 6 :(得分:20)
如果效率对您来说不重要,可以在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
答案 7 :(得分:16)
适用于2018年以上
从PHP 7.3开始,有一个array_key_first()
函数可以实现以下目的:
$array = ['foo' => 'lorem', 'bar' => 'ipsum'];
$firstKey = array_key_first($array); // 'foo'
文档可用here。
答案 8 :(得分:12)
$myArray = array(
2 => '3th element',
4 => 'first element',
1 => 'second element',
3 => '4th element'
);
echo min(array_keys($myArray)); // return 1
答案 9 :(得分:11)
请找到以下内容:
$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$keys = array_keys($yourArray);
echo "Key = ".$keys[0];
答案 10 :(得分:9)
这也可以是一种解决方案。
$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$first_key = current(array_flip($yourArray));
echo $first_key;
我已经测试了它并且它有效。
答案 11 :(得分:4)
为了增强Webmut的解决方案,我添加了以下解决方案:
$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秒)。
答案 12 :(得分:3)
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
list($first_key) = each($arr);
print $first_key;
// key1
答案 13 :(得分:3)
对我有用的最佳方式是
System.Windows.Threading.DispatcherOperation op = App.RootFrame.Dispatcher.BeginInvoke(new Func<Uri>(() =>
{
return RootFrame.CurrentSource;
})
);
await op; //Not awaitable.
array_shift(array_keys($array))
从初始数组获取键数组,然后array_keys
从第一个元素值中删除它。
你需要PHP 5.4+。
答案 14 :(得分:2)
php73:
$array = ['a' => '..', 'b' => '..'];
array_key_first($array); // 'a'
array_key_last($array); // 'b';
答案 15 :(得分:2)
这是我找到的更简单的方法。快速而且只有两行代码:-D
$keys = array_keys($array);
echo $array[$keys[0]];
答案 16 :(得分:1)
关于@Blixt 的回答,在 7.3.0 之前,可以使用这个 polyfill:
if (!function_exists('array_key_first')) {
function array_key_first(array $array) {
return key(array_slice($array, 0, 1, true));
}
}
答案 17 :(得分:0)
今天我必须搜索POST请求返回的数组的第一个键。 (并注意表单ID的编号等)
好吧,我发现了这个: Return first key of associative array in PHP
我已经完成了这项工作,并且有效。
$data = $request->request->all();
dump($data);
while ($test = current($data)) {
dump($test);
echo key($data).'<br />';die();
break;
}
也许它会生态15分钟的另一个人。 CYA。
答案 18 :(得分:0)
使用:
$array = ['po','co','so'];
echo reset($array);
结果:po
答案 19 :(得分:0)
我认为最好,最快的方法是:
$first_key=key(array_slice($array, 0, 1, TRUE))
答案 20 :(得分:0)
因为可以使用PHP 7.3.0函数array_key_first()
。
有几种方法可以为PHP 7.3.0之前的版本提供此功能。可以使用array_keys()
,但效率可能很低。也可以使用reset()
和key()
,但这可能会更改内部数组指针。一种有效的解决方案,它不更改内部数组指针,写为polyfill:
<?php
if (!function_exists('array_key_first')) {
function array_key_first(array $arr) {
foreach($arr as $key => $unused) {
return $key;
}
return NULL;
}
}
?>
答案 21 :(得分:0)
单行:
$array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
echo key( array_slice( $array, 0, 1, true ) );
# echos 'key1'
答案 22 :(得分:-2)
您可以使用阵列
current
要获取数组的第一个元素,您可以使用end
,对于最后一个元素,您可以使用array_keys
修改强>
只是为了不再获得答案的答案,您可以使用OPENSHIFT_DATA_DIR
将键转换为值,并使用如上所示。