【发布时间】:2011-10-05 14:53:11
【问题描述】:
我正在尝试获取关联数组的第一个键,而不是通过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'
我的问题中使用“无参考”条款的原因只是因为我认为array_keys() 是必需的(如果有办法通过参考传递,请开除)
我会使用key(),但这需要reset(),因为我不确定执行此操作时指针的位置。
附录
我正在跟进我最近的一个认识:正如我在 cmets 中提到的,它会使用相同的内存,所以如果这是一个问题,这个问题没有解决方案。
$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 没有这样的优化功能,但认为它值得明确提及。
虽然接受的答案很简洁,但如果您使用的是合理大小的数组,那么它会起作用。
【问题讨论】:
-
我对
foreach($array as &$key) { return $key; }有一个模糊的 hackish 想法,可能会完成你想要的,但我懒得测试它,也不太确定你想要什么。 -
@Marc B foreach($array as $key=>$value) { return $key; } 应该可以工作
-
@Marc B - 尝试使用单个语句返回值。我可以将
foreach包裹在call_user_func(function(){})中,但这有点疯狂。 -
我刚刚意识到:我认为如何切片并不重要,因为现在 IIRC,
array_keys()无论如何都会在内存中创建数组键的副本,即使立即取消引用也是如此。单一表达式的简洁性很好,但内存消耗仍然存在。 -
我刚刚意识到其他事情;这个问题已经自嘲了,好像你还在用
标签: php arrays key associative-array