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?

Kliknij opcję Głos za
źródło
(odniesienie) Arrays and Array Functions
Gordon

Odpowiedzi:

288

reset() podaje pierwszą wartość tablicy, jeśli wewnątrz tablicy znajduje się element:

$value = reset($array);

Podaje również FALSEw przypadku, gdy tablica jest pusta.

soulmerge
źródło
Uwaga:$arr = array(/* stuff */); $val = $arr? reset($arr): /* value to indicate array is empty */;
cwallenpoole
Więcej informacji na temat funkcji resetowania: www.w3schools.com/php/func_array_reset.asp
Paul Chris Jones,
A jeśli chcę uzyskać klucz i wartość?
Timberman
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];
}
LSerni
źródło
@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";
John Kugelman
źródło
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);
Jeremy Ruten
źródło
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.

cwallenpoole
źródło
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]
Początkujący
źródło
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);
}
w3bMak3r
źródło
3

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

Zamiast

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

Tak jak reset()

zwraca pierwszy element tablicy po resecie;

Suryasish Dey
źródło
2

Możesz zrobić:

$values = array_values($array);
echo $values[0];
d0niek
źródło
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

Wakar Ahmad Khan
źródło
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));
?>
Spacerować
źródło
1

Możesz użyć array_shift

Cesar
źródło
4
Należy jednak pamiętać, że z tablicy zostanie usunięty jeden element.
Challet
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
Daantje
źródło
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)];
cjc
źródło
-3

możesz po prostu użyć $array[0]. zawsze da ci pierwszy przedmiot

Kareem Salem
źródło