Jak uzyskać pierwszy element z asocjacyjnej tablicy PHP?


146

Gdybym miał tablicę taką jak:

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

I chciałem wydobyć pierwszy element z tej tablicy, nie znając klucza, jak mam to zrobić? Czy jest do tego funkcja?


(odniesienie) Arrays and Array Functions
Gordon

Odpowiedzi:



51

PHP <7.3.0

Jeśli nie wiesz wystarczająco dużo o tablicy (nie jesteś pewien, czy pierwszy klucz to foo czy bar ), to tablica może być również pusta .

Dlatego najlepiej byłoby to sprawdzić, zwłaszcza jeśli istnieje szansa, że ​​zwrócona wartość może być logiczną FAŁSZ:

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

Powyższy kod używa reseti ma efekty uboczne (resetuje wewnętrzny wskaźnik tablicy), więc możesz preferować użycie array_slicedo szybkiego dostępu do kopii pierwszego elementu tablicy:

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

Zakładając, że chcesz uzyskać osobno klucz i wartość , musisz dodać czwarty parametr do array_slice:

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

Aby otrzymać pierwszą pozycję jako parę ( key => value):

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

Prosta modyfikacja, aby uzyskać osobno ostatni element, klucz i wartość:

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

występ

Jeśli tablica nie jest naprawdę duża, w rzeczywistości nie potrzebujesz array_slicei możesz raczej uzyskać kopię całej tablicy kluczy, a następnie uzyskać pierwszy element:

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

Jeśli jednak masz bardzo dużą tablicę, wywołanie array_keysbędzie wymagało znacznie więcej czasu i pamięci array_slice(obie funkcje przechodzą przez tablicę, ale ta ostatnia kończy się, gdy tylko zgromadzi wymaganą liczbę elementów - czyli jeden).

Godnym uwagi wyjątkiem jest sytuacja, w której masz pierwszy klucz, który wskazuje na bardzo duży i zawiły obiekt. W takim przypadku array_slicezduplikuje ten pierwszy duży obiekt, a array_keysjedynie złapie klucze.

PHP 7.3.0

PHP 7.3 implementuje array_key_first()równieżarray_key_last() . Są one jawnie udostępniane w celu wydajnego uzyskiwania dostępu do pierwszego i ostatniego klucza bez resetowania stanu wewnętrznego tablicy jako efektu ubocznego.

Więc w PHP 7.3 pierwsza wartość z $arraymoże być dostępne z

$array[array_key_first($array)];

Nadal lepiej sprawdź, czy tablica nie jest pusta, bo inaczej otrzymasz błąd:

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

@AhmedShefeer cóż, druga odpowiedź jest nie tylko zaakceptowana, ale jest tam jeszcze osiem lat . W pewnym sensie zbieram tu okruchy :-D. Ale dzięki za wotum zaufania!
LSerni

1
Wydaje mi się, że jest to najlepsza odpowiedź, ponieważ jedyną inną, która nie jest przestarzała, która podaje zarówno klucz, jak i wartość, jest przerwana pętla foreach, co jest niezręczne. Pozostałe odpowiedzi podają tylko wartość bez klucza.
sootsnoot

1
uwielbiałem to i nowoczesne podejście, aktualizowane z czasem.
sanjeet bisht

@LSerni Nie wiem, czy nadal jesteś aktywny, ale utknąłem i ten dobrze wyjaśniony i zaktualizowany post mnie uratował. Dziękuję
izk

@izk Jestem zawsze aktywny! :-D
LSerni

44

Fałszywa pętla, która zrywa się przy pierwszej iteracji:

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

echo "$key = $value\n";

Lub użyj each()( ostrzeżenie: przestarzałe w PHP 7.2.0 ):

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

echo "$key = $value\n";

2
Prawdopodobnie dlatego, że reset () jest prostszy.
mjs

1
Ponieważ rozwiązanie znajduje się w pierwszej linii kodu, ale kontynuujesz pisanie innej, całkowicie niepotrzebnej linii.
markus

21
reset nie zwróci klucza
HarryFink

3
+1 za „fałszywą pętlę”. Musiałem pobrać klucz i wartość pierwszego elementu, nie przechodząc przez każdy element. reset()Funkcja będzie pobierać tylko pierwszą wartość.
Phil Cross,

2
+1 również dla fałszywej pętli, muszę zachować klucz, więc reset nie był opcją
isJustMe

25

Jest kilka opcji. array_shift()zwróci pierwszy element, ale usunie również pierwszy element z tablicy.

$first = array_shift($array);

current() zwróci wartość tablicy, na którą wskazuje wskaźnik pamięci wewnętrznej, która jest domyślnie pierwszym elementem.

$first = current($array);

Jeśli chcesz mieć pewność, że wskazuje na pierwszy element, zawsze możesz użyć reset().

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

3
Podoba mi się ta odpowiedź jako najbardziej kompletna, ale uwaga w reset()rzeczywistości zwraca element, więc śledzenie tego z a $first = current($array)jest zbędne.
Tom Auger,

9

Po prostu mamy kilka innych opcji: reset($arr);wystarczająco dobre, jeśli nie próbujesz utrzymać wskaźnika tablicy w miejscu, a przy bardzo dużych tablicach powoduje to minimalne obciążenie. To powiedziawszy, są z tym pewne problemy:

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

Sposób na zrobienie tego bez zmiany wskaźnika:

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

Zaletą $arr[reset(array_keys($arr))];jest to, że generuje ostrzeżenie, jeśli tablica jest rzeczywiście pusta.


bardzo opisowa odpowiedź, która wiele znaczy dla innych. Dzięki.
Jigar7521

7

inny łatwy i prosty sposób, aby to zrobić, użyj wartości_tablicowych

array_values($array)[0]

reset()jest znacznie lepszą opcją, ponieważ zwraca wartość false, jeśli tablica jest pusta. Twoje rozwiązanie nie zadziała na przykład w pytaniu
Northys

1
W PHP 7+ działałoby coś takiego:array_values($array)[0] ?? FALSE
MarthyM

4

Sprawdź, czy zmienna a jest tablicą przed uzyskaniem pierwszego elementu. Podczas dynamicznego tworzenia tablicy, jeśli ma ona wartość null, pojawia się błąd.

Na przykład:

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

3

Możemy zrobić $first = reset($array);

Zamiast

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

Tak jak reset()

zwraca pierwszy element tablicy po resecie;


2

Możesz zrobić:

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

2

Użyj funkcji reset (), aby pobrać pierwszy element z tej tablicy bez znajomości klucza do niej w ten sposób.

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

wyjście // 400


2

Możesz tego spróbować.

Aby uzyskać pierwszą wartość tablicy: -

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

Aby uzyskać pierwszy klucz tablicy

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


1

Robię to, aby uzyskać pierwszą i ostatnią wartość. Działa to również z większą liczbą wartości.

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

Działa to tylko wtedy, gdy wewnętrzny wskaźnik znajduje się na pierwszym elemencie. Chociaż jest to dobre, ponieważ nie resetuje położenia wskaźnika, działa tylko wtedy, gdy wskaźnik jest już w spoczynku.
cjc

1

Począwszy od PHP 7.3.0 można to zrobić bez resetowania wewnętrznego wskaźnika. Użyłbyś array_key_first. Jeśli jesteś pewien, że twoja tablica ma wartości, możesz po prostu zrobić:

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

Bardziej prawdopodobne jest, że będziesz chciał obsłużyć przypadek, w którym tablica jest pusta:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.