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

146

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

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

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

Нажмите Upvote
источник
(ссылка) Массивы и функции массивов
Гордон

Ответы:

288

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

$value = reset($array);

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

soulmerge
источник
На заметку:$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];
}
LSerni
источник
@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))];заключается в том, что он выдает предупреждение, если массив фактически пуст.

cwallenpoole
источник
очень описательный ответ, и это много значит для других. Спасибо чувак.
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);
}
w3bMak3r
источник
3

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

Вместо того

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

Так как reset()

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

Сурьяш Дей
источник
2

Ты можешь сделать:

$values = array_values($array);
echo $values[0];
d0niek
источник
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

Вы могли бы использовать array_shift

Cesar
источник
4
Но учтите, что в массиве будет удален один элемент.
шале
1

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

$a = array(
    'foo' => 400,
    'bar' => 'xyz',
);
$first = current($a);   //400
$last = end($a);    //xyz
Daantje
источник
Это работает только тогда, когда внутренний указатель находится на первом элементе. Хотя это хорошо, потому что он не сбрасывает положение указателя, он работает только тогда, когда указатель уже находится в состоянии покоя.
CJC
1

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

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

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

$first = (empty($array)) ? $default : $array[array_key_first($array)];
CJC
источник
-3

Вы можете просто использовать $array[0]. это даст вам первый товар всегда

Карим Салем
источник