Jak zdobyć ostatni klucz w tablicy?

335

Jak mogę uzyskać ostatni klucz tablicy?

ajsie
źródło
10
Należy podać tablicę asocjacyjną, tablicę numeryczną lub jeśli ma działać na obu.
Jimbo Jonny
często zadawane pytanie
Josua Marcel Chrisano

Odpowiedzi:

610

Rozwiązaniem byłoby użycie kombinacji endi (cytowanie) :key

  • end() przesuwa wewnętrzny wskaźnik tablicy do ostatniego elementu i zwraca jego wartość.
  • key() zwraca element indeksu bieżącej pozycji tablicy.

Tak więc część kodu, taka jak ta, powinna załatwić sprawę:

$array = array(
    'first' => 123,
    'second' => 456,
    'last' => 789, 
);

end($array);         // move the internal pointer to the end of the array
$key = key($array);  // fetches the key of the element pointed to by the internal pointer

var_dump($key);

Wyjdzie:

string 'last' (length=4)

tzn. klucz ostatniego elementu mojej tablicy.

Po wykonaniu tej czynności wewnętrzny wskaźnik tablicy znajdzie się na końcu tablicy. Jak wskazano w komentarzach, możesz chcieć uruchomić reset()tablicę, aby wskaźnik powrócił na początek tablicy.

Pascal MARTIN
źródło
17
@Pim: zależy od tego, co OP chce zrobić z tą tablicą po (może nie być konieczne do wywołania reset()) ;; ale masz rację wskazując tę ​​funkcję, która może być przydatna.
Pascal MARTIN
3
@PascalMARTIN +1 Myślę, że dodanie komentarza dotyczącego resetowania () w odpowiedzi będzie bardzo pomocne.
Lulu,
To podejście nie działa, jeśli tablica ma zduplikowane wartości. na przykład. dla array('a', 'b', 'c', 'd', 'a')powróci klawisz 0 zamiast 4.
Marc
2
@Marc to podejście działa poprawnie, nawet jeśli istnieje zduplikowana wartość.
Jeff
1
@pppp to nie działa, ponieważ ... sprawdź, co zwraca end (), a następnie pomyśl jeszcze raz;)
forsberg
79

Choć end()wydaje się najłatwiejszy, nie jest najszybszy. Szybsza i znacznie silniejsza alternatywa to array_slice():

$lastKey = key(array_slice($array, -1, 1, true));

Jak mówią testy , w macierzy z 500 000 elementów jest prawie 7 razy szybsza!

Tadej Magajna
źródło
98
podekscytowany tą odpowiedzią zrobiłem szybki test 100 000 iteracji, porównując (a) end($arr);$key = key($arr);reset($arr);z (b) $key = key(array_slice($arr,-1,1,true));... co skutkowało end()DUŻO szybszym! end () = 0,05326 sekund, array_slice = 8.506 sekund ... huh ??
neokio
54
Wbudowane funkcje PHP zostały zbudowane przez ekstremalnych frajerów. Nie próbuj ponownie tworzyć tych funkcji. Szanse są takie, że robisz coś znacznie wolniej niż oryginał. Chyba że jesteś jakimś złym czarodziejem.
dmmd 18.03.13
16
end()jest najszybszy, ponieważ można go wyprowadzić z bardzo prostej funkcji C, takiej jak:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
Gustav,
10
@Gustav Wierzę, że podstawowa implementacja C PHP, faktycznie ma wewnętrzny wskaźnik lastdo ostatniego elementu. Robienie end()prawie O (1). :-)
Eric,
15
@dmmd, jestem pewien, że zespół PHP byłby bardzo zadowolony, że nazywają się kujonami.
datasn.io
53

wolę

end(array_keys($myarr))
Rutger van Baren
źródło
19
powoduje OGŁOSZONĄ UWAGĘ, koniec oczekuje zmiennej zmiennej
Wiliam,
25
Możesz użyć, end((array_keys($myarr)))aby obejść ogłoszenie.
Ben Fortune,
9
@BenFortune Zostało to naprawione w PHP7: „W PHP 5 użycie nadmiarowych nawiasów wokół parametru funkcji może wyciszyć ostrzeżenia o surowych standardach, gdy parametr funkcji został przekazany przez odniesienie. Ostrzeżenie będzie teraz zawsze emitowane”.
Dominic Scheirlinck,
to całkowicie niepotrzebne ostrzeżenie! to takie normalne i zwyczajne rzeczy we wszystkich innych językach!
azerafati,
1
W innych językach funkcje nie działają na wskaźnikach, prawda?
jurchiks
52

Od PHP 7.3 (2018) jest (wreszcie) funkcja do tego: http://php.net/manual/en/function.array-key-last.php

$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )

wyjdzie

orange
Patryk Godowski
źródło
4
Horray! Właśnie miałem dodać tę odpowiedź. Czy możesz wyróżnić wersję „PHP 7.3” i rok 2018? Łatwiej będzie dostrzec tę niesamowitą wiadomość dla innych
Tomáš Votruba,
Warto również wspomnieć, że NIE wpływa to na wewnętrzny wskaźnik tablicy.
mvorisek
30

Po prostu użyj : echo $array[count($array) - 1];

Aditya Choudhary
źródło
75
Działa to tylko wtedy, gdy masz tablice numeryczne. Nie działa z powiązanymi tablicami.
Jeremy J Starcher,
12
To nie tylko działa tylko na tablicach numerycznych, ale nie pokazuje klucza, ale pokazuje wartość, prawda?
Nanne
ja też jake, czy możemy zrobić coś, w czym podzielimy to (bądźmy szczerzy) hitem google zarówno na numeryczne, jak i asocjacyjne, dzięki czemu mamy stare odniesienie do obu ... Rozpracowałem to tylko dla assoc po analizie, int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }która jest ciekawe, ale nie dobre dla biznesu, gdy masz ograniczony czas
lol
5
Ponadto, nawet w przypadku tablicy numerycznej, pamiętaj, że tablice numeryczne nie muszą iść w kolejności lub używać wszystkich liczb. Działa to, jeśli nie przypisujesz jawnie wartości liczbowych, ale jeśli tak zrobisz $a[1] = 1; $a[5] = 5; $a[0] = 0;, będziesz mieć tablicę z kluczami (1, 5, 0), w tej kolejności. count($a)da 3 i $a[2]nie jest zdefiniowany. Z pewnością nie daje ci 5 z powrotem.
Daniel Skarbek,
1
Przeczytaj ponownie pytanie „Jak zdobyć ostatni klucz w tablicy?”
20

Nie wiem, czy będzie to szybsze, czy nie, ale wydaje się, że łatwiej jest to zrobić w ten sposób i można uniknąć błędu, nie przekazując funkcji do końca () ...

potrzebna była tylko zmienna ... nic wielkiego, aby napisać jeszcze jedną linię kodu, a następnie ją rozbroić, jeśli zajdzie taka potrzeba.

$array = array(
    'first' => 123,
    'second' => 456,
    'last' => 789, 
);

$keys = array_keys($array);
$last = end($keys);
Ryan Hungate
źródło
2
Ta odpowiedź (choć technicznie poprawna) jest marnotrawna / nieefektywna, ponieważ wymaga utworzenia dodatkowej tablicy (o takiej samej długości jak oryginał). Oznacza to, że marnotrawstwo wzrasta, podobnie jak oryginalny układ. Nie należy nigdy wybierać tej opcji zamiast skutecznej odpowiedzi Pascala MARTINA. Dziwi mnie, że ma tak wiele pozytywnych opinii.
mickmackusa,
12

Od wersji PHP 7.3 możesz bezpośrednio uzyskać dostęp do ostatniego klucza w (zewnętrznym poziomie) tablicy za pomocą array_key_last ()

Ostatecznie większość debaty na tej stronie leży w łóżku. Jest bezkonkurencyjny, osiąga najlepsze wyniki, nie odczuwa żadnych skutków ubocznych i jest bezpośrednią, intuicyjną techniką pojedynczego połączenia, która zapewnia dokładnie to, czego szuka to pytanie.

Szorstki wzorzec jako dowód: https://3v4l.org/hO1Yf

array_slice() + key():  1.4
end() + key():         13.7
array_key_last():       0.00015

* tablica testowa zawiera 500000 elementów, mikrotime powtórzone 100x, następnie uśrednione, a następnie pomnożone przez 1000, aby uniknąć notacji naukowej. Podziękowania dla @MAChitgarha za wstępny test porównawczy skomentowany pod odpowiedzią @ TadejMagajna .

Oznacza to, że możesz pobrać wartość ostatniego klucza bez:

  1. przesunięcie wskaźnika tablicy (co wymaga dwóch linii kodu) lub
  2. sortowanie, cofanie, wyskakiwanie, liczenie, indeksowanie tablicy kluczy lub dowolne inne wygłupy

Ta funkcja była od dawna spóźniona i jest mile widzianym dodatkiem do paska narzędzi funkcji tablicy, który poprawia wydajność, pozwala uniknąć niepożądanych efektów ubocznych i umożliwia czysty / bezpośredni / intuicyjny kod.

Oto demo :

$array = ["a" => "one", "b" => "two", "c" => "three"];
if (!function_exists('array_key_last')) {
    echo "please upgrade to php7.3";
} else {
    echo "First Key: " , key($array) , "\n";
    echo "Last Key: " , array_key_last($array) , "\n";
    next($array);                 // move array pointer to second element
    echo "Second Key: " , key($array) , "\n";
    echo "Still Last Key: " , array_key_last($array);
}

Wynik:

First Key: a
Last Key: c     // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c     // <-- unaffected by the pointer position, NICE!

Niektóre uwagi:

  • array_key_last()jest funkcją rodzeństwa array_key_first () .
  • Obie te funkcje są „ignoranckie”.
  • Obie funkcje zwracają się, nulljeśli tablica jest pusta.
  • Odrzucone funkcje rodzeństwa ( array_value_first()& array_value_last()) również zaoferowałyby nieświadomy wskaźnik dostępu do elementów bookend, ale najwyraźniej nie udało im się zdobyć wystarczającej liczby głosów, aby ożywić.

Oto kilka odpowiednich stron omawiających nowe funkcje:

ps Jeśli ktoś zastanawia się nad innymi technikami, możesz odnieść się do tego małego zbioru porównań: ( Demo )

Duration of array_slice() + key():     0.35353660583496
Duration of end() + key():             6.7495584487915
Duration of array_key_last():          0.00025749206542969
Duration of array_keys() + end():      7.6123380661011
Duration of array_reverse() + key():   6.7875385284424
Duration of array_slice() + foreach(): 0.28870105743408
mickmackusa
źródło
2
Ta odpowiedź powinna znajdować się na górze listy. Jest po prostu kompletny.
John
1
Wow, DV na mojej odpowiedzi? Co się stało, zbyt wyczerpujące / ostateczne / wyjaśniające / wspierane? Pfft. Zdecydowanie kontynuuj publikowanie postów, które odważą się poinformować. Dobra robota. Jeśli nie wiesz, przycisk DV służy do postów, które są „nieprzydatne”. Zadaj sobie pytanie, jaki jest twój cel tutaj.
mickmackusa
8

Spróbuj użyć funkcji array_pop i array_keys w następujący sposób:

<?php

$array = array(
    'one' => 1,
    'two' => 2,
    'three' => 3
);

echo array_pop(array_keys($array)); // prints three

?>
kodaddict
źródło
14
Jest to bardzo powolne, jeśli twoja tablica zawiera więcej niż jedną rzecz. Proszę nie rób tego.
Andrey,
3
i powoduje również ŚCISŁĄ UWAGĘ, zmienne odwołanie
Wiliam,
array_pop () skróciłoby pierwotną tablicę (usuwając ostatni element). Nie jestem pewien, czy ma to znaczenie dla PO, ale na pewno będzie miało znaczenie dla innych.
Programster
1
Nie całkiem. W tym przykładzie array_pop()działa na wartości zwracanej, array_keys()a nie na oryginalnej tablicy.
Petko Bossakov
Ponieważ istnieją inne, bardziej wydajne odpowiedzi, które nie wywołują OGŁOSZENIA, głosuję za odrzuceniem tej odpowiedzi.
mickmackusa,
6

Począwszy od PHP> = 7.3 array_key_last()jest najlepszym sposobem na uzyskanie ostatniego klucza z dowolnej tablicy. Korzystanie z kombinacji end(), key()a reset()tylko po to żeby ostatni klucz tablicy jest oburzające.

$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3

porównaj to do

end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)

Jeśli używasz kombinacji end()i, musisz zresetować tablicę, aby wskaźnik znajdował się na początkukey()

Hilary Okoro
źródło
4

Chciałbym również zaoferować alternatywne rozwiązanie tego problemu.

Zakładając, że wszystkie twoje klucze są numeryczne bez żadnych luk, moją preferowaną metodą jest policzenie tablicy, a następnie minus 1 od tej wartości (aby uwzględnić fakt, że klucze tablicy zaczynają się od 0.

$array = array(0=>'dog', 1=>'cat');

$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];

var_dump($lastKey);
print_r($lastKeyValue);

To dałoby ci:

int (1) cat


źródło
1
Nie zadziała to w przypadku tablic, w których klucze nie są przyrostowe, np. Tablica (0 => „pies”, 5 => „kot”); $ lastKey zwróci niepoprawną wartość
kakoma
@kakoma - Jak mówi mój post „Zakładając, że wszystkie twoje klucze są numeryczne bez żadnych luk”.
Dla każdego, kto zastanawia się, skorzystaj z „array_values” PHP, aby ponownie ustawić tablicę na sekwencję numeryczną. php.net/manual/en/function.array-values.php
1
Ponieważ ta odpowiedź dotyczy tylko ułamka możliwości tablicy (numeryczne, kolejne tablice z kluczami), odpowiedź ta nie oferuje solidnej / poprawnej odpowiedzi na uogólnione pytanie OP. Głosuj
mickmackusa,
4

Możesz użyć tego:

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array); 
echo key($array);

Innym rozwiązaniem jest utworzenie funkcji i użycie jej:

function endKey($array){
end($array);
return key($array);
}

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($array);
Atif Tariq
źródło
1
Ta odpowiedź nie zawiera niczego nowego, czego nie ma jeszcze w tym wątku.
Martin
1
Martin, nikt nie używa funkcji, aby uzyskać wynik.
Atif Tariq,
1
czy potrzebujesz dodać 1 linię kodu do funkcji? To raczej niepotrzebny interfejs.
Martin,
1
Martin, która jedna linia.
Atif Tariq,
2
wiersz w twojej funkcji
Martin
3
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3
voodoo417
źródło
2
Odwrócenie całej tablicy tylko w celu pobrania jednej wartości jest z pewnością mniej wydajne niż metoda PascalMARTIN. Mimo że jest to technicznie poprawne, nigdy nie należy go używać zamiast podejścia Pascala.
mickmackusa,
3

Właśnie wziąłem funkcję pomocniczą od Xandera i poprawiłem ją, udzielając odpowiedzi wcześniej:

function last($array){
  $keys = array_keys($array);
  return end($keys);
}


$arr = array("one" => "apple", "two" => "orange", "three" => "pear");    
echo last($arr);
echo $arr(last($arr));
Steve
źródło
1

Spróbuj tego z array_reverse().

 $arr = array(
     'first' => 01,
     'second' => 10,
     'third' => 20, 
 );  
 $key = key(array_reverse($arr));
 var_dump($key);
Vishal Kumar
źródło
1

To dziwne, ale dlaczego ten temat nie ma tej odpowiedzi:

$lastKey = array_keys($array)[count($array)-1];

Alex
źródło
0
$array = array(
    'something' => array(1,2,3),
    'somethingelse' => array(1,2,3,4)
);

$last_value = end($array);
$last_key = key($array); // 'somethingelse'

Działa to, ponieważ PHP przenosi wewnętrznie wskaźnik tablicy dla $ array

Scottymeuk
źródło
2
Jest to duplikat metody PascalMARTIN. Oszczędź tę stronę i usuń spóźnioną / zduplikowaną odpowiedź. Doceniony.
mickmackusa,
0

Najlepsze możliwe rozwiązanie, które można zastosować również w linii:

end($arr) && false ?: key($arr)

To rozwiązanie jest tylko wyrażeniem / stwierdzeniem i zapewnia dobre, a nie najlepszą możliwą wydajność.

Wstawione przykładowe użycie:

$obj->setValue(
    end($arr) && false ?: key($arr) // last $arr key
);


AKTUALIZACJA: W PHP 7.3+: użyj (oczywiście) nowo dodanej array_key_last()metody.

mvorisek
źródło