Отримайте перший елемент масиву


1071

У мене є масив:

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

Я хотів би отримати перший елемент цього масиву. Очікуваний результат: рядок apple

Одна з вимог: це не можна зробити за допомогою посилання , тому array_shiftце не є хорошим рішенням.

Як я можу це зробити?


1
Що ви маєте на увазі, не можна зробити посилання?
cjk

Функція не повинна працювати &$arrayяк парами.
hsz

4
Я підозрюю, що те, що ви "насправді" розумієте під "не можна зробити за допомогою посилання", - це те, що ваш масив динамічно повертається з бази даних, і ви не хочете передавати масив у змінну, перш ніж приймати перший елемент з цього. Якщо я маю рацію, то переважна більшість усіх запропонованих нижче рішень (включаючи прийняту відповідь) є недостатніми.
cartbeforehorse

Вам просто потрібно дістати його або дістати та видалити з існуючого масиву?
Джо Смо

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

Відповіді:


1367

Оригінальна відповідь, але дорога (O (n)):

array_shift(array_values($array));

В O (1):

array_pop(array_reverse($array));

Інші випадки використання тощо ...

Якщо модифікація (у сенсі скидання покажчиків масиву) $arrayне є проблемою, ви можете використовувати:

reset($array);

Це має бути теоретично більш ефективним, якщо потрібна копія масиву:

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

З PHP 5.4+ (але може призвести до помилки індексу, якщо порожній):

array_values($array)[0];

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

44
Я отримую це: <b> Суворі стандарти </b>: Лише змінні повинні передаватися за посиланням. Хороший обхід btw
Симона

191
Це не трохи зайве? Що робити, якщо масив містить кілька тисяч елементів? Чи виправдано створити цілий новий масив лише для того, щоб отримати його перший елемент? list()і reset()є набагато приємнішими рішеннями на мою думку.
Мартін Димитров

33
Я згоден. Загальний надмір і надзвичайний ресурс важкий порівняно з одним рядком, який скидає та повертає поточне значення: скидання ($ масив);
zmonteca

48
-1 Як сказали вище коментатори. Мені бентежить, що в цьому році є 101 підказка.
Гонки легкості по орбіті

789

Як зазначав Майк (найпростіший можливий спосіб):

$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, ні Лука Cousins ​​не мають рації: 1) foreach не використовує інтернатний покажчик масиву - натомість він створює власний покажчик. Легко перевірити скидання виклику всередині foreach - цикл буде слідувати його шляхом без ефекту від reset(). 2) Ні, foreach НЕ створює копію масиву !!! Він лише створює власний вказівник (навіть не копію існуючого - це також легко перевірити, зателефонувавши next()перед виступом).
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
найкраща відповідь! шукав ключову () еквівалентність, щоб отримати перше значення. Це допомагає!
Ален Тімбло

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

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


1
не зрозумів, що ти маєш на увазі? Добре працює, чи ключ першого більше, ніж другий.
йода

29
+1 FYI 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 цього не відображають. Тому я думаю, що це стало найкращим рішенням.
Райан

@ Райан погодився, але це рішення було надано за 2 роки до 2014 року в іншій відповіді цієї самої теми ... Дивно, що це неповне речення отримало більше відгуків.
CPHPython

70

Ви можете отримати N-й елемент за допомогою мовної конструкції "list":

// 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, коли масив порожній.
Тгр

1
@Mike так, але тоді це вже не так елегантно :)
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 ​​() це виправляє, але погіршує ефективність та (що важливіше) читабельність коду.
Варбо

55

PHP 5.4+:

array_values($array)[0];

Це для класних людей, які керують останніми та найбільшими. ;)
Зенексер

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) ];

Скоротіть з оператором null-coalescing , як правило, null за замовчуванням, тому: $first_value = $my_array[array_key_first($my_array)] ?? null;
Mitchell McKenna

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;
}

Я вважаю, що це один з найшвидших способів, оскільки використання мовної конструкції передбачити, а не виклик функції (що дорожче). 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)отримує перше значення масиву


EDIT:
Щодо коментарів нижче. Вийде наступний приклад: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 () отримає поточний елемент, а не перший елемент. Це інакше.
Amirhossein Tarmast

Поточний буде працювати, якщо в масиві є лише один елемент.
Замер Фузан


14

Я б робив echo current($array).


1
@hsz Не має значення, current()не помиляється, коли передаються не посилання. За умови, що покажчик ще на початку, це працює.
Ден Лугг

але воно створює Повідомлення, яке робить ваші журнали брудними та здоровими ... Ви повинні позбутися від Повідомлень також, якщо вони не є критичними
dmikam

1
@dmikam ні, це не так. Фактично resetстворює повідомлення "Тільки змінні повинні бути передані за посиланням", але currentне: Інтернет-редактор PHP прикладcurrent(array_filter(...)); .
CPHPython

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

1
@CPHPython Трохи штучний приклад, але він добре демонструє мої думки: sandbox.onlinephpfunctions.com/code/… просто уявіть, що ви отримуєте свій масив від якоїсь функції, яка використовує next(), end()або будь-якої іншої функції, що модифікує внутрішній покажчик масиву. У моєму прикладі current()повертає null, оскільки внутрішній покажчик маси не знаходиться в діапазоні. Але це може «практично» вказувати і на будь-який / випадковий елемент.
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
Принаймні, ви чесні - це химерно! Але це працює, і я його використовував у минулому, поки не вивчив вищевказану техніку.
random_user_name

1
Якщо ви робите це, ви можете також використовувати, reset()як вказівник масиву скидається, перш ніж foreachвикликається.
Тизоїд

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 , мені вдалося це:

<?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 () + клавіша ()

<?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 ), не створюючи СТРИКТ "Лише змінні повинні передаватися за посиланням".

Якщо це так, майже всі описані тут способи отримають це повідомлення ... а деякі з них використовують багато додаткової пам'яті, що дублює масив (або якусь його частину). Простий спосіб уникнути цього - просто призначити значення вбудованого, перш ніж викликати будь-яку з цих функцій:

$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.