Получить первый элемент массива


1074

У меня есть массив:

array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )

Я хотел бы получить первый элемент этого массива. Ожидаемый результат: строка apple

Одно требование: это не может быть сделано с передачей по ссылке , поэтому array_shiftне является хорошим решением.

Как я могу это сделать?


1
Что вы имеете в виду, не может быть сделано по ссылке?
CJK

Функция не должна работать с использованием в &$arrayкачестве параметров.
hsz

4
Я подозреваю, что то, что вы «на самом деле» подразумеваете под «не может быть сделано по ссылке», заключается в том, что ваш массив динамически возвращается из базы данных, и вы не хотите передавать массив в переменную перед тем, как взять первый элемент. от него. Если я прав, то подавляющего большинства всех решений, предоставленных вам ниже (включая принятый ответ), недостаточно.
конюшня

Вам просто нужно получить его или получить и удалить из существующего массива?
Джо Смо

Для основного использования массивов вы можете просмотреть эту ссылку technofusions.com/introduction-to-arrays-in-php
Vikrant Vir Bhalla

Ответы:


1371

Оригинальный ответ, но дорогой (O (n)):

array_shift(array_values($array));

В O (1):

array_pop(array_reverse($array));

Другие варианты использования и т.д ...

Если изменение (в смысле сброса указателей массива) $arrayне является проблемой, вы можете использовать:

reset($array);

Это должно быть теоретически более эффективно, если требуется массив «copy»:

array_shift(array_slice($array, 0, 1));

В PHP 5.4+ (но может вызвать ошибку индекса, если пусто):

array_values($array)[0];

77
+1 за умный обходной путь для предотвращения изменения исходного массива с помощью array_values ​​()
ChrisR

44
Я получаю это: <b> Строгие стандарты </ b>: только переменные должны передаваться по ссылке. Хороший обходной путь
Simone

191
Разве это не немного перебор? Что если массив содержит несколько тысяч элементов? Оправдано ли создавать целый новый массив только для того, чтобы получить его первый элемент? list()и reset()гораздо более приятные решения на мой взгляд.
Мартин Димитров

33
Согласен. Общее перерасход и необычайно большой ресурс по сравнению с одной строкой, которая сбрасывает и возвращает текущее значение: reset ($ array);
Zmonteca

48
-1 Как сказали выше комментаторы. Это сбивает с толку меня, что это имеет 101 голосов.
Гонки легкости на орбите

791

Как указал Майк (самый простой способ):

$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
echo reset($arr); // Echoes "apple"

Если вы хотите получить ключ: (выполните его после сброса)

echo key($arr); // Echoes "4"

Из документации PHP :

смешанный сброс (массив и $ массив );

Описание:

reset () перематывает внутренний указатель массива на первый элемент и возвращает значение первого элемента массива, или FALSE, если массив пуст.


Хотя он передается по ссылке для сброса, исходный массив не изменяется. Я предполагаю, что это причина, по которой hsz не хочет передавать ее по ссылке ..?
Деннис Джамин

10
Итератор массива изменен. Если вы сделаете это в foreachмассиве объектов, вы облажаетесь.
Zenexer

2
@ Zenexer это не всегда (обычно) правда. Обычно на практике foreachкопируют массив, через который он проходит.
Люк Казинс

1
@Angger после сброса, вы можете позвонить key($arr)и вы получите «4» (добавлен в ответ)
Lepe

3
Ни @Zenexer, ни Luke Cousins ​​не правы: 1) foreach не использует указатель интернаста массива - вместо этого он создает свой собственный указатель. Легко проверить сброс вызова внутри foreach - цикл будет следовать без каких-либо последствий reset(). 2) Нет, foreach НЕ создает копию массива !!! Он только создает собственный указатель (даже не копию существующего - его также легко проверить, вызывая next()перед foreach).
dmikam

278
$first_value = reset($array); // First element's value
$first_key = key($array); // First element's key

2
Я на самом деле не проверял это, но кажется, что этот подход будет наиболее эффективным.
mason81

4
Единственная проблема - вопрос, который задают для значения, а не для ключа. Таким образом, текущий ($ массив) должен использоваться вместо ключа ($ массив)
zmonteca

4
@zmonteca $ first_value = сброс ($ массив); здесь вы получаете значение, функция reset () перематывает массивы внутреннего указателя и возвращает первый элемент.
S3Mi

1
лучший ответ! искал эквивалентность key (), чтобы получить первое значение. Это помогает!
Ален Тьембло

98
$arr = array( 9 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($arr); // echoes 'apple'

Если вы не хотите терять текущую позицию указателя, просто создайте псевдоним для массива.


1
не понял, что ты имеешь в виду? Он отлично работает, если ключ первого больше, чем другие.
Йода

29
+1 К вашему сведению reset()уже возвращает первый элемент, поэтому использовать его не нужно current()- echo reset($arr)должно хватить
Майк

Но вы @ Mike могли бы предпочесть , currentчтобы resetизбежать PHP уведомления / ошибку , полученную в справочных случаях, например , current(array_filter(...));в 3v4l .
CPHPython

91

current($array)может получить первый элемент массива, согласно руководству по PHP .

Каждый массив имеет внутренний указатель на свой «текущий» элемент, который инициализируется первым элементом, вставленным в массив.

Так что это работает до тех пор, пока вы не переместите указатель массива, иначе вам придется сбросить массив.


4
Я не знаю, почему это не был принят ответ, так как он отвечает на вопрос довольно просто и точно.
Отпуск

26
current($array)будет работать, только если указатель массива «в данный момент» указывает на первый элемент, в противном случае reset($array)потребуется.
Джон

6
Кажется, current()больше не требуется ссылка, хотя документы PHP не отражают этого. Поэтому я думаю, что это стало лучшим решением.
Райан

@Ryan согласился, но это решение было дано за 2 года до 2014 года в другом ответе этой же темы ... Странно, что это неполное предложение получило больше голосов.
CPHPython

70

Вы можете получить N-й элемент с помощью языковой конструкции "список":

// First item
list($firstItem) = $yourArray;

// First item from an array that is returned from a function
list($firstItem) = functionThatReturnsArray();

// Second item
list( , $secondItem) = $yourArray;

С помощью array_keysфункции вы можете сделать то же самое для клавиш:

list($firstKey) = array_keys($yourArray);
list(, $secondKey) = array_keys($yourArray);

2
Это именно то, что я делаю: на list($first_value) = $my_array;мой взгляд, самый лучший вариант. У него нет проблем, связанных с другими ответами, представленными здесь: нет «перегиба», потому что он не копирует ни массив, ни создает новый. Нет «ссылок»: массив не изменен. Нет «сброса»: нет изменений во внутреннем указателе массива ...
Дж. Бруни

6
Очень элегантное решение, но выдает E_NOTICE, когда массив пуст.
Tgr

1
@ Майк, да, но тогда это уже не так элегантно :)
Tgr

13
Разве это не так ?! Это работает, только если ключи массива int, попробуйте сделать, list($firstItem) = array('key1' => 'value1');и вы получите ошибкуNotice: Undefined offset: 0
Marco Demaio

12
Чтобы уточнить: list($x) = foo();эквивалентно $x = foo()[0];. Обратите внимание, что это не обязательно то же самое, что «получить первый элемент», поскольку даже массив с целочисленным индексом может не иметь элемента с ключом 0. В моем случае я делал «list ($ order) = get_order ($ user) ;» но «get_order» возвращал заказы, основанные на их идентификаторе, который обычно не был 0. Как говорит @Sergiy, array_values ​​() исправляет это, но снижает эффективность и (что более важно) удобочитаемость кода.
Warbo

55

PHP 5.4+:

array_values($array)[0];

Это для крутых людей, которые управляют самыми последними и лучшими. ;)
Zenexer

1
Он отредактировал свой ответ в октябре 2013 года, чтобы включить мой ответ, который я добавил в апреле.
Самер Ата

PHP 4:$array_values = array_values($array); $value = $array_values[0];
zdick

38

В PHP 7.3 добавлены две функции для непосредственного получения первого и последнего ключа массива без изменения исходного массива и без создания каких-либо временных объектов:

Помимо того, что они семантически значимы, эти функции даже не перемещают указатель массива (как foreachбыло бы).

Имея ключи, можно получить значения по ключам напрямую.


Примеры (все они требуют PHP 7.3+)

Получение первого / последнего ключа и значения:

$my_array = ['IT', 'rules', 'the', 'world'];

$first_key = array_key_first($my_array);
$first_value = $my_array[$first_key];

$last_key = array_key_last($my_array);
$last_value = $my_array[$last_key];

Получение первого / последнего значения в виде однострочников при условии, что массив не может быть пустым :

$first_value = $my_array[ array_key_first($my_array) ];

$last_value = $my_array[ array_key_last($my_array) ];

Получение первого / последнего значения в виде однострочников со значениями по умолчанию для пустых массивов:

$first_value = empty($my_array) ? 'default' : $my_array[ array_key_first($my_array) ];

$last_value = empty($my_array) ? 'default' : $my_array[ array_key_last($my_array) ];

Сокращается с помощью объединяющего ноль оператора , обычно значение по умолчанию равно нулю так: $first_value = $my_array[array_key_first($my_array)] ?? null;
Митчелл МакКенна

29

Предположим, что:

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

Просто используйте:

$array[key($array)]

чтобы получить первый элемент или

key($array)

чтобы получить первый ключ.

Или вы можете отсоединить первый, если вы хотите удалить его.


9
Что не просто использовать currentтогда?
Марко Демайо

27

Некоторые массивы не работают с функциями , как list, resetилиcurrent . Может быть, это «ложные» массивы - например, частично реализующие ArrayIterator.

Если вы хотите получить первое значение независимо от массива, вы можете замкнуть итератор:

foreach($array_with_unknown_keys as $value) break;

Ваше значение будет доступно в $value и цикл будет прерван после первой итерации. Это более эффективно, чем копирование потенциально большого массива в функцию типа array_unshift (array_values ​​($ arr)).

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

foreach($array_with_unknown_keys as $key=>$value) break;

Если вы вызываете это из функции, просто вернитесь рано:

function grab_first($arr) {
    foreach($arr as $value) return $value;
}

Я предполагаю, что это один из самых быстрых способов, потому что использование языковой конструкции foreach, а не вызов функции (что обходится дороже). designcise.com/web/tutorial/……
Ильдар Аманкулов,

19

От помощников Ларавела :

function head($array)
{
    return reset($array);
}

Массив, передаваемый по значению функции, reset () влияет на внутренний указатель копии массива и не касается исходного массива (обратите внимание, что он возвращаетfalse если массив пуст).

Пример использования:

$data = ['foo', 'bar', 'baz'];

current($data); // foo
next($data); // bar
head($data); // foo
next($data); // baz

Также здесь есть альтернатива. Это немного быстрее, но интереснее. Это позволяет легко изменить значение по умолчанию, если массив пуст:

function head($array, $default = null)
{
    foreach ($array as $item) {
        return $item;
    }
    return $default;
}

Для записи, вот еще один мой ответ , для последнего элемента массива.


17

Держите это просто! Здесь есть много правильных ответов, но чтобы минимизировать путаницу, эти две работы работают и уменьшают много накладных расходов:

key($array)получает первый ключ массива
current($array)получает первое значение массива


РЕДАКТИРОВАТЬ:
Относительно комментариев ниже. Следующий пример выведет:string(13) "PHP code test"

$array = array
(
   '1'           => 'PHP code test',  
   'foo'         => 'bar', 5 , 5 => 89009, 
   'case'        => 'Random Stuff: '.rand(100,999),
   'PHP Version' => phpversion(),
   0             => 'ending text here'
);

var_dump(current($array));

11
Гм. currentравно текущему элементу Вы должны сбросить указатель на начало массива, чтобы убедиться, что он действительно в начале.
Waterloomatt

current () получит текущий элемент, а не первый элемент. Это другое.
Амирхосейн Тармаст

current будет работать, если в массиве только один элемент.
Замир Фузан


14

Я бы сделал echo current($array).


1
@hsz Не имеет значения, current()не выдает ошибку при передаче не ссылки. При условии, что указатель все еще находится в начале, это работает.
Дэн Лугг

но он создает Уведомление, которое делает ваши журналы грязными и исправными ... вы должны избавиться от Уведомлений, также если они не критичны
dmikam

1
@dmikam нет, это не так. На самом деле resetвыдает уведомление «Только переменные должны передаваться по ссылке», в то время как currentэто не так: Пример онлайнового редактора PHPcurrent(array_filter(...)); .
CPHPython

@CPHPython, похоже, что вы правы ... похоже, у меня была эта идея тока из старых времен PHP 4, где она действительно приводит к фатальной ошибке: sandbox.onlinephpfunctions.com/code/… Единственная проблема, которую я вижу при использовании current что он не гарантирует, что возвращаемый элемент является первым элементом массива (внутренний указатель может быть изменен вызываемой функцией). Фактически он может возвращать случайный элемент массива.
dmikam

1
@CPHPython Немного искусственный пример, но он хорошо демонстрирует мои мысли: sandbox.onlinephpfunctions.com/code/… просто представьте, что вы получаете свой массив от какой-либо функции, которая использует next(), end()или от любой другой функции, которая изменяет внутренний указатель массива. В моем примере current()возвращает ноль, потому что внутренний указатель находится вне диапазона массива. Но он также может «виртуально» указывать на любой / случайный элемент.
dmikam

13
$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
foreach($arr as $first) break;
echo $first;

Вывод:

apple

10
$myArray = array (4 => 'apple', 7 => 'orange', 13 => 'plum');
$arrayKeys = array_keys($myArray);

// The first element of your array is:
echo $myArray[$arrayKeys[0]];

Я не пошел так, как описано в принятом ответе. Использовал твое спасибо
JayKandari

9
$array=array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

$firstValue = each($array)[1];

Это гораздо эффективнее, чем array_values()потому, что each()функция не копирует весь массив.

Для получения дополнительной информации см. Http://www.php.net/manual/en/function.each.php


because the each() function does not copy the entire array.+1

2
Но дело в том, что вы должны сделать сброс раньше, если внутренний указатель не в начале, вы не собираетесь получить первый элемент.
Карлос Гоче

Но каждый () получает массив по ссылке, и требование первоначальных вопросов не состоит в том, чтобы сделать это
dmikam

8

Клудгый способ это:

$foo = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

function get_first ($foo) {
    foreach ($foo as $k=>$v){
        return $v;
    }
}

print get_first($foo);

3
По крайней мере, вы честны - это глупо! Но это работает, и я использовал его в прошлом, пока не изучил технику list () выше.
random_user_name

1
Если вы делаете это, вы также можете использовать, так reset()как указатель массива сбрасывается до того, foreachкак он все равно будет вызван.
Tyzoid

7

Получить первый элемент:

array_values($arr)[0]

Получить последний элемент

array_reverse($arr)[0]

Числовые ключи сохраняются с array_reverse, так что он по-прежнему будет возвращать первый элемент. 3v4l.org/2729s
не паникуйте

7

Большинство из них работают! НО для быстрого однострочного (низкого ресурса) вызова:

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo $array[key($array)];

// key($array) -> will return the first key (which is 4 in this example)

Хотя это работает, и прилично хорошо, пожалуйста, смотрите мой дополнительный ответ: https://stackoverflow.com/a/48410351/1804013


5
Это эквивалентно использованию current($array), которое требует, чтобы внутренний указатель массива был на первом элементе в любом случае, и в этом случае echo reset($array)наиболее подходящим.
Tyzoid

@ Тизоид, он на самом деле написал здесь еще один ответ с твоим предложением , но он не дал твоего объяснения ... Спасибо.
CPHPython

@Tyzoid: Я сделал дополнительный ответ / обновление на некоторое время: stackoverflow.com/a/48410351/1804013
tfont

5

Я думаю, что использование array_values будет вашим лучшим выбором. Вы можете вернуть значение с нулевым индексом из результата этой функции, чтобы получить «яблоко».


5

Это немного поздно для игры, но я столкнулся с проблемой, когда мой массив содержал элементы массива как дочерние элементы внутри него, и поэтому я не мог просто получить строковое представление первого элемента массива. При использовании РНР current()функции , мне удалось это:

<?php
    $original = array(4 => array('one', 'two'), 7 => array('three', 'four'));
    reset($original);  // to reset the internal array pointer...
    $first_element = current($original);  // get the current element...
?>

Благодаря всем текущим решениям мне удалось получить этот ответ, надеюсь, это поможет кому-нибудь когда-нибудь!


4

Использование:

$first = array_slice($array, 0, 1);  
$val= $first[0];

По умолчанию array_sliceключи не сохраняются, поэтому мы можем смело использовать ноль в качестве индекса.


4

Два решения для вас.

Решение 1 - Просто используйте ключ. Вы не сказали, что вы не можете его использовать. :)

<?php
    // Get the first element of this array.
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Gets the first element by key
    $result = $array[4];

    // Expected result: string apple
    assert('$result === "apple" /* Expected result: string apple. */');
?>

Решение 2 - array_flip () + key ()

<?php
    // Get first element of this array. Expected result: string apple
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Turn values to keys
    $array = array_flip($array);

    // You might thrown a reset in just to make sure
    // that the array pointer is at the first element.
    // Also, reset returns the first element.
    // reset($myArray);

    // Return the first key
    $firstKey = key($array);

    assert('$firstKey === "apple" /* Expected result: string apple. */');
?>

Решение 3 - array_keys ()

echo $array[array_keys($array)[0]];

2

Это не такой простой ответ в реальном мире. Предположим, у нас есть примеры возможных ответов, которые вы можете найти в некоторых библиотеках.

$array1 = array();
$array2 = array(1,2,3,4);
$array3 = array('hello'=>'world', 'foo'=>'bar');
$array4 = null;

var_dump('reset1', reset($array1));
var_dump('reset2', reset($array2));
var_dump('reset3', reset($array3));
var_dump('reset4', reset($array4)); // Warning

var_dump('array_shift1', array_shift($array1));
var_dump('array_shift2', array_shift($array2));
var_dump('array_shift3', array_shift($array3));
var_dump('array_shift4', array_shift($array4)); // Warning

var_dump('each1', each($array1));
var_dump('each2', each($array2));
var_dump('each3', each($array3));
var_dump('each4', each($array4)); // Warning

var_dump('array_values1', array_values($array1)[0]); // Notice
var_dump('array_values2', array_values($array2)[0]);
var_dump('array_values3', array_values($array3)[0]);
var_dump('array_values4', array_values($array4)[0]); // Warning

var_dump('array_slice1', array_slice($array1, 0, 1));
var_dump('array_slice2', array_slice($array2, 0, 1));
var_dump('array_slice3', array_slice($array3, 0, 1));
var_dump('array_slice4', array_slice($array4, 0, 1)); // Warning

list($elm) = $array1; // Notice
var_dump($elm);
list($elm) = $array2;
var_dump($elm);
list($elm) = $array3; // Notice
var_dump($elm);
list($elm) = $array4;
var_dump($elm);

Как вы можете видеть, у нас есть несколько решений «одной линии», которые хорошо работают в некоторых случаях, но не во всех.

На мой взгляд, у вас должен быть этот обработчик только с массивами.

Теперь поговорим о производительности, предполагая, что у нас всегда есть массив, например:

$elm = empty($array) ? null : ...($array);

...you would use without errors:
$array[count($array)-1];
array_shift
reset
array_values
array_slice

array_shiftбыстрее reset, то есть быстрее, чем [count () - 1], и эти три быстрее, чем array_valuesи array_slice.


2

Я предполагаю, что автор просто искал способ получить первый элемент массива после получения его от какой-либо функции ( например , mysql_fetch_row ) без генерации STRICT «Только переменные должны передаваться по ссылке».

Если это так, то почти все способы, описанные здесь, получат это сообщение ... и некоторые из них используют много дополнительной памяти, дублирующей массив (или некоторую его часть). Простой способ избежать этого - просто присвоить значение inline перед вызовом любой из этих функций:

$first_item_of_array = current($tmp_arr = mysql_fetch_row(...));
// or
$first_item_of_array = reset($tmp_arr = func_get_my_huge_array());

Таким образом, вы не получаете сообщение STRICT ни на экране, ни в журналах, ни создаваете дополнительные массивы. Он работает как с индексированными, так и с ассоциативными массивами.


1

Мне нравится пример «списка», но «список» работает только в левой части задания. Если мы не хотим присваивать переменную, мы были бы вынуждены создать временное имя, которое в лучшем случае загрязняет нашу область видимости, а в худшем случае перезаписывает существующее значение:

list($x) = some_array();
var_dump($x);

Выше будет перезаписывать любое существующее значение $ x, а переменная $ x будет зависать, пока эта область активна (конец этой функции / метода или навсегда, если мы находимся на верхнем уровне). Это можно обойти, используя call_user_func и анонимную функцию, но это неуклюже:

var_dump(call_user_func(function($arr) { list($x) = $arr; return $x; },
                        some_array()));

Если мы будем использовать анонимные функции, подобные этой, мы сможем избежать перезагрузки и array_shift, даже если они используют передачу по ссылке. Это потому, что вызов функции будет связывать ее аргументы, и эти аргументы могут быть переданы по ссылке:

var_dump(call_user_func(function($arr) { return reset($arr); },
                        array_values(some_array())));

Однако это на самом деле излишне, так как call_user_func выполнит это временное назначение внутри. Это позволяет нам обрабатывать функции передачи по ссылке, как если бы они были передачей по значению, без каких-либо предупреждений или ошибок:

var_dump(call_user_func('reset', array_values(some_array())));

1

Небольшое изменение в том, что написал Сарфраз:

$array = array(1, 2, 3, 4, 5);
$output = array_slice($array, 0, 1);
print_r ($output);

1

Мне не нравится возиться с внутренним указателем массива, но также неэффективно создавать второй массив с array_keys()или array_values(), поэтому я обычно определяю это:

function array_first(array $f) {
    foreach ($f as $v) {
        return $v;
    }
    throw new Exception('array was empty');
}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.