Как получить первый элемент из ассоциативного массива PHP?


146

Если бы у меня был массив, как:

$array['foo'] = 400;
$array['bar'] = 'xyz';

И я хотел получить первый элемент из этого массива, не зная ключа для него, как бы я это сделал? Есть ли функция для этого?


Ответы:


288

reset() дает вам первое значение массива, если у вас есть элемент внутри массива:

$value = reset($array);

Это также дает вам, FALSEесли массив пуст.


На заметку:$arr = array(/* stuff */); $val = $arr? reset($arr): /* value to indicate array is empty */;
cwallenpoole

Более подробная информация о функции сброса: www.w3schools.com/php/func_array_reset.asp
Пол Крис Джонс

Что если я хочу получить ключ и значение?
Тимберман

51

PHP <7.3

Если вы недостаточно знаете о массиве (вы не уверены, является ли первый ключ foo или bar ), тогда массив также может быть, может быть, пустым .

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

$value = empty($arr) ? $default : reset($arr);

Приведенный выше код использует resetи поэтому имеют побочные эффекты (она сбрасывает внутренний указатель массива), так что вы можете предпочитаете использовать array_sliceдля быстрого доступа к копии первого элемента массива:

$value = $default;
foreach(array_slice($arr, 0, 1) as $value);

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

foreach(array_slice($arr, 0, 1, true) as $key => $value);

Чтобы получить первый элемент в виде пары ( key => value):

$item = array_slice($arr, 0, 1, true);

Простая модификация для получения последнего элемента, ключа и значения отдельно:

foreach(array_slice($arr, -1, 1, true) as $key => $value);

производительность

Если массив не очень большой, вам на самом деле не нужно, array_sliceи вы можете получить копию всего массива ключей, а затем получить первый элемент:

$key = count($arr) ? array_keys($arr)[0] : null;

Однако, если у вас очень большой массив, для вызова array_keysпотребуется больше времени и памяти больше, чем array_slice(обе функции обходят массив, но последняя завершает работу, как только набирает требуемое количество элементов - то есть один).

Заметное исключение - когда у вас есть первый ключ, который указывает на очень большой и извилистый объект. В этом случае array_sliceбудет дублировать этот первый большой объект, а array_keysзахватывать будут только ключи.

PHP 7.3

PHP 7.3 реализует array_key_first()так же, как и array_key_last(). Они явно предоставлены для эффективного доступа к первому и последнему ключам без сброса внутреннего состояния массива в качестве побочного эффекта.

Таким образом , в PHP 7.3 первое значение из $arrayмогут быть доступны с

$array[array_key_first($array)];

Вам все равно лучше проверить, что массив не пустой, иначе вы получите ошибку:

$firstKey = array_key_first($array);
if (null === $firstKey) {
    $value = "Array is empty"; // An error should be handled here
} else {
    $value = $array[$firstKey];
}

@AhmedShefeer хорошо, другой ответ не только принят, но был там еще восемь лет . Я как бы собираю крошки здесь :-D. Но спасибо за доверие!
LSerni

1
Мне кажется, что это лучший ответ, так как единственная другая не осуждаемая, которая дает ключ и значение, это прерванный цикл foreach, что неудобно. Другие ответы дают только значение без ключа.
Sootsnoot

1
очень понравился этот, современный подход и со временем обновляется.
Санжит Бишт

@LSerni Не знаю, если вы все еще активны, но я застрял, и этот хорошо объясненный и обновленный пост спас меня. Спасибо
Izk

@izk Я всегда активен! :-D
LSerni

44

Поддельный цикл, который прерывается на первой итерации:

$key = $value = NULL;
foreach ($array as $key => $value) {
    break;
}

echo "$key = $value\n";

Или используйте each()( предупреждение: устарело с PHP 7.2.0 ):

reset($array);
list($key, $value) = each($array);

echo "$key = $value\n";

2
Возможно, потому что reset () проще.
MJS

1
Потому что решение находится в вашей первой строке кода, но вы продолжаете писать еще одну совершенно ненужную строку.
Маркус

21
Сброс не вернет ключ
HarryFink

3
+1 за «фальшивую петлю». Мне нужно было получить ключ и значение первых элементов, не проходя через каждый элемент. reset()Функция будет извлекать только первое значение.
Фил Кросс

2
+1 для фальшивого цикла, мне нужно сохранить ключ, чтобы сброс не был опцией
isJustMe

25

Там есть несколько вариантов. array_shift()вернет первый элемент, но он также удалит первый элемент из массива.

$first = array_shift($array);

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

$first = current($array);

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

reset($array);
$first = current($array);

3
Мне нравится этот ответ как наиболее полный, но на reset()самом деле note возвращает элемент, поэтому после него с $first = current($array)избыточностью.
Том Ожер

9

Просто для того, чтобы у нас были некоторые другие варианты: reset($arr);достаточно, если вы не пытаетесь удерживать указатель массива на месте, а с очень большими массивами это требует минимальных затрат. Тем не менее, есть некоторые проблемы с этим:

$arr = array(1,2);
current($arr); // 1
next($arr);    // 2
current($arr); // 2
reset($arr);   // 1
current($arr); // 1 !This was 2 before! We've changed the array's pointer.

Способ сделать это без изменения указателя:

$arr[reset(array_keys($arr))]; // OR
reset(array_values($arr));

Преимущество $arr[reset(array_keys($arr))];заключается в том, что он выдает предупреждение, если массив фактически пуст.


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

7

другой простой и легкий способ сделать это, используя array_values

array_values($array)[0]

reset()это гораздо лучший вариант, так как он возвращает false, если массив пуст. ваше решение не сработает, например, в вопросе
Northys

1
В PHP 7+ примерно так будет работать:array_values($array)[0] ?? FALSE
MarthyM

4

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

Например:

if(is_array($array))
{
  reset($array);
  $first = key($array);
}

3

Мы можем сделать $first = reset($array);

Вместо того

reset($array);
$first = current($array);

Так как reset()

возвращает первый элемент массива после сброса;



2

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

$value = array('foo' => 400, 'bar' => 'xyz');
echo reset($value);

выход // 400


2

Вы можете попробовать это.

Чтобы получить первое значение массива: -

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   var_dump(current($large_array));
?>

Чтобы получить первый ключ массива

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   $large_array_keys = array_keys($large_array);
   var_dump(array_shift($large_array_keys));
?>


1

Я делаю это, чтобы получить первое и последнее значение. Это работает с большим количеством значений тоже.

$a = array(
    'foo' => 400,
    'bar' => 'xyz',
);
$first = current($a);   //400
$last = end($a);    //xyz

Это работает только тогда, когда внутренний указатель находится на первом элементе. Хотя это хорошо, потому что он не сбрасывает положение указателя, он работает только тогда, когда указатель уже находится в состоянии покоя.
CJC

1

Начиная с PHP 7.3.0 можно обойтись без сброса внутреннего указателя. Вы бы использовали array_key_first. Если вы уверены, что ваш массив имеет значения, то вы можете просто сделать:

$first = $array[array_key_first($array)];

Скорее всего, вы захотите обработать случай, когда массив пуст:

$first = (empty($array)) ? $default : $array[array_key_first($array)];

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