我试图获得关联数组的第一个键,而不通过array_keys()
或类似的方式创建临时变量,通过引用传递。不幸的是,reset()
和array_shift()
都通过引用来接受数组参数,因此两者似乎都不是可行的结果。
有了PHP 5.4,我将在天堂;array_keys($array)[0];
,但不幸的是,这当然也不是一个选项。
我可以创建一个函数来达到这个目的,但我只能想象有一些PHP的array_*
函数的混合物,将在单个语句中产生所需的结果,这是我无法想到或提出的。
:
$array = array('foo' => 'bar', 'hello' => 'world');
$firstKey = assorted_functions($array); // $firstKey = 'foo'
我的问题中"no reference"从句的原因只是因为我假设需要array_keys()
(如果有通过引用的方法,请删除)
我将使用key()
,但这需要reset()
,因为我不确定指针在此操作时的位置。
附录
我正在跟踪我最近的一个认识:正如我在评论中提到的,它将使用内存,所以如果这是一个问题,这个问题没有解决方案。
$a = range(0,99999);
var_dump(memory_get_peak_usage()); // int(8644416)
$k = array_keys($a)[0];
var_dump(memory_get_peak_usage()); // int(17168824)
我知道这一点,因为PHP没有这样的优化功能,但认为有必要明确提及。
可接受的答案的简洁性很好,如果您正在使用合理的大小的数组,则可以使用。
虽然array_shift(array_keys($array));
可以工作,但current(array_keys($array));
更快,因为它不移动内部指针。
任何一个都可以。
更新正如@TomcatExodus所指出的,array_shift();
期望通过引用传递数组,因此第一个示例将发出错误。最好使用current();
可以使用reset和key:
reset( $array );
$first_key = key( $array );
或者,你可以使用一个函数:
function firstIndex($a) { foreach ($a as $k => $v) return $k; }
$key = firstIndex( $array );
array_shift(array_keys($array))
each()
仍然是临时需要的,但潜在的开销比使用array_keys()
要小得多。
如何使用array_slice(与关联数组的array_keys结合使用)?
$a = range(0,999999);
var_dump(memory_get_peak_usage());
$k = array_keys(array_slice($a, 0, 1, TRUE))[0];
var_dump(memory_get_peak_usage());
var_dump($k);
$k = array_keys($a)[0];
var_dump(memory_get_peak_usage());
给出输出(至少对我来说):
int(36354360)
int(36355112)
int(0)
int(72006024)
int(0)