Intereting Posts

Вернуть первый ключ ассоциативного массива в PHP

Я пытаюсь получить первый ключ ассоциативного массива, не создавая временную переменную через array_keys() или подобное, для передачи по ссылке. К сожалению, как reset() и array_shift() принимают аргумент массива по ссылке, поэтому ни один из них не может быть жизнеспособным.

С PHP 5.4 я буду на небесах; array_keys($array)[0]; , но, к сожалению, это тоже не вариант.

Я мог бы создать функцию, которая будет служить цели, но я могу только представить себе, что существует некоторая смесь функций array_* PHP, которые будут приводить к желаемому результату в одном утверждении , о котором я не могу придумать или придумать.

Так:

 $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 не имеет таких возможностей оптимизации, но полагал, что это требует явного упоминания.

Краткость принятого ответа хороша, хотя, и будет работать, если вы работаете с массивами разумного размера.

Хотя array_shift(array_keys($array)); будет работать, current(array_keys($array)); быстрее, поскольку он не продвигает внутренний указатель.

Однако любой из них будет работать.

Обновить

Как отметил @TomcatExodus, array_shift(); ожидает массив, переданный по ссылке, поэтому первый пример приведет к ошибке. Лучше всего придерживаться current();

Вы можете использовать сброс и ключ :

 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)