Вернуть первый ключ ассоциативного массива в PHP
Я пытаюсь получить первый ключ ассоциативного массива, не создавая временную переменную через 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()
, поскольку я не уверен, где будет указатель во время этой операции.
Добавление
Я слежу за реализацией, которая была у меня недавно: как я упоминал в комментариях, она все равно будет использовать память, поэтому, если это вызывает беспокойство, у этого вопроса нет решения.
$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 не имеет таких возможностей оптимизации, но полагал, что это требует явного упоминания.
Краткость принятого ответа хороша, хотя, и будет работать, если вы работаете с массивами разумного размера.
Ответы
Ответ 1
Хотя array_shift(array_keys($array));
будет работать, current(array_keys($array));
работает быстрее, так как он не продвигает внутренний указатель.
Либо один будет работать.
Update
Как отметил @TomcatExodus, array_shift();
ожидает массив, переданный по ссылке, поэтому первый пример выдаст ошибку. Лучше всего придерживаться current();
Ответ 2
Вы можете использовать reset и key:
reset( $array );
$first_key = key( $array );
или вы можете использовать функцию:
function firstIndex($a) { foreach ($a as $k => $v) return $k; }
$key = firstIndex( $array );
Ответ 3
array_shift(array_keys($array))
Ответ 4
each()
по-прежнему требуется временное, но потенциально намного меньше накладных расходов, чем при использовании array_keys()
.
Ответ 5
Как насчет использования 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)