提问人:Alex S 提问时间:6/23/2009 最后编辑:BlixtAlex S 更新时间:1/29/2022 访问量:651917
获取(可能)关联数组中的第一个键?
Get first key in a (possibly) associative array?
问:
确定可能关联数组中的第一个键的最佳方法是什么?我的第一个想法是只考虑数组,然后立即破坏它,如下所示:
foreach ($an_array as $key => $val) break;
因此,$key包含第一个密钥,但这似乎效率低下。有没有人有更好的解决方案?
答:
array_keys
返回键数组。以第一个条目为例。或者,您可以调用数组,然后调用 .后一种方法可能稍微快一些(我没有测试过),但它有重置内部指针的副作用。reset
key
评论
foreach
break
reset
key
foreach
next
current
key($an_array)
会给你第一把钥匙
edit per Blixt:您应该调用 before 以重置指向数组开头的指针。reset($array);
key($an_array)
评论
2019年更新
从 PHP 7.3 开始,有一个新的内置函数,它将从给定的数组中检索第一个键,而无需重置内部指针。有关详细信息,请查看文档。array_key_first()
reset($array);
$first_key = key($array);
它基本上与初始代码相同,但开销少一点,并且更明显地说明了正在发生的事情。
只要记得调用 ,否则你可能会得到数组中的任何键。您也可以使用 end
而不是 of 来获取最后一个密钥。reset
reset
如果您希望密钥获取第一个值,请实际返回它:reset
$first_value = reset($array);
不过,有一个特殊情况需要注意(因此请先检查数组的长度):
$arr1 = array(false);
$arr2 = array();
var_dump(reset($arr1) === reset($arr2)); // bool(true)
评论
reset()
reset()
Don't use
array
reset
$prop
array(…)
next
reset
end
key
reset
key
请找到以下内容:
$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
评论
max()
这也可能是一个解决方案:
$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)
IT)
评论
array_keys($arr)[0]
有趣的是,foreach 循环实际上是最有效的方法。
由于OP专门询问了效率,因此应该指出的是,目前的所有答案实际上都远不如预言有效。
我用 php 5.4 对此进行了基准测试,重置/键指针方法(接受的答案)似乎比 foreach 慢了大约 7 倍。其他操作整个阵列的方法(array_keys、array_flip)显然比这更慢,并且在处理大型阵列时会变得更糟。
Foreach一点也不低效,随意使用!
编辑 2015-03-03:
已经要求了基准测试脚本,我没有原始脚本,而是进行了一些新的测试。这一次,我发现 foreach 的速度只有重置/键的两倍左右。我使用了一个 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
reset+键 http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs
评论
foreach
$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
从初始数组中获取键数组,然后从中剪切第一个元素值。
为此,您将需要 PHP 5.4+。array_shift
你可以玩你的阵列
$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中返回关联数组的第一个键
我已经这样做了,而且它有效。
$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 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 秒)。
对于 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 之前的版本提供此功能。可以使用,但效率可能相当低。也可以使用 和 ,但这可能会更改内部数组指针。一个有效的解决方案,它不改变内部数组指针,写成 polyfill:array_keys()
reset()
key()
<?php
if (!function_exists('array_key_first')) {
function array_key_first(array $arr) {
foreach($arr as $key => $unused) {
return $key;
}
return null;
}
}
?>
关于@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));
}
}
这将适用于所有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);
评论
foreach
要么 each($arr)['key']
要么就可以了。each($arr)[0]
0.0107
0.0217