Як отримати перший елемент з асоціативного масиву 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
Мені здається, це найкраща відповідь, оскільки єдиний інший непридатний, який дає і ключ, і значення, - це перерваний цикл передпліччя, який незручно. Інші відповіді дають лише значення без ключа.
sootsnoot

1
любив цей анс, сучасний підхід і оновлений з часом.
sanjeet bisht

@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
Можливо, тому, що скинути () простіше.
міс

1
Тому що рішення знаходиться у вашому першому рядку коду, але ви продовжуєте писати ще один абсолютно непотрібний рядок.
Маркус

21
скинути
бажання

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()насправді повертає елемент, тож наступне, що з a $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

Ви можете зробити:

$values = array_values($array);
echo $values[0];

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.