确定可能关联数组中的第一个键的最佳方法是什么? 我首先想到的是,它只存储数组,然后立即破坏它,如下所示:
foreach ($an_array as $key => $val) break;
因此,让$ key包含第一个键,但这似乎效率很低。 有谁有更好的解决方案?
#1楼
list($firstKey) = array_keys($yourArray);
#2楼
array_keys
返回一个键数组。 以第一个条目。 另外,您可以在阵列上调用reset
,然后再调用key
。 后一种方法可能会稍快一些(我没有测试过),但是它具有重置内部指针的副作用。
#3楼
key($an_array)
将给你第一个键
每个Blixt编辑:您应该调用reset($array);
在key($an_array)
之前将指针重置为数组的开头。
#4楼
2019更新
从PHP 7.3开始,有一个名为array_key_first()
的新内置函数,该函数将从给定数组中检索第一个键,而无需重置内部指针。 查看文档以获取更多信息。
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)
#5楼
$myArray = array(
2 => '3th element',
4 => 'first element',
1 => 'second element',
3 => '4th element'
);
echo min(array_keys($myArray)); // return 1
#6楼
这也可能是一个解决方案。
$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$first_key = current(array_flip($yourArray));
echo $first_key;
我已经对其进行了测试,并且可以正常工作。
#7楼
如果效率对您而言并不那么重要,则可以在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)
)。
高温超导
#8楼
有趣的是,foreach循环实际上是最有效的方法。
由于OP特别询问了效率,因此应该指出,当前所有答案的效率实际上都比foreach低得多。
我使用php 5.4进行了基准测试,并且reset / key指针方法(可接受的答案)似乎比foreach慢7倍。 操纵整个阵列的其他方法(array_keys,array_flip)明显更慢比并配有大型阵列工作时变得更糟 。
Foreach一点也不低效,请随时使用它!
编辑2015-03-03:
基准脚本已被要求,我没有原始脚本,但是做了一些新的测试。 这次,我发现foreach仅是reset / key的两倍。 我使用了100个键的数组,并且每种方法都运行了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
#9楼
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
list($first_key) = each($arr);
print $first_key;
// key1
#10楼
你可以试试
array_keys($data)[0]
#11楼
单线:
$array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
echo key( array_slice( $array, 0, 1, true ) );
# echos 'key1'
#12楼
对我来说最好的方法是
array_shift(array_keys($array))
array_keys
从初始数组中获取键数组,然后array_shift
从它的第一个元素值array_shift
剪切。 为此,您将需要PHP 5.4+。
#13楼
你可以玩你的数组
$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
将键转换为值,并使用如上所示。
#14楼
这是我曾经发现的更简单的方法。 快速而只有两行代码:-D
$keys = array_keys($array);
echo $array[$keys[0]];
#15楼
今天,我不得不搜索POST请求返回的数组的第一个键。 (并记下表格ID等的数字)
好吧,我发现了这一点: 在PHP中返回关联数组的第一个键
我已经做到了,并且有效。
$data = $request->request->all();
dump($data);
while ($test = current($data)) {
dump($test);
echo key($data).'<br />';die();
break;
}
也许它将节省15分钟的另一个人。 CYA。
#16楼
为了增强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秒)。
#17楼
对于2018年+
从PHP 7.3开始,有一个array_key_first()
函数可以完全实现此目的:
$array = ['foo' => 'lorem', 'bar' => 'ipsum'];
$firstKey = array_key_first($array); // 'foo'
文档可在此处获得 。 😉
#18楼
php73:
$array = ['a' => '..', 'b' => '..'];
array_key_first($array); // 'a'
array_key_last($array); // 'b';
http://php.net/manual/zh/function.array-key-first.php
#19楼
请找到以下内容:
$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$keys = array_keys($yourArray);
echo "Key = ".$keys[0];