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.
@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!
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.
@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?
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.
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.
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.
* 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:
przesunięcie wskaźnika tablicy (co wymaga dwóch linii kodu) lub
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.
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:
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.
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.
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.
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
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:
Odpowiedzi:
Rozwiązaniem byłoby użycie kombinacji
end
i (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ę:
Wyjdzie:
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.źródło
reset()
) ;; ale masz rację wskazując tę funkcję, która może być przydatna.array('a', 'b', 'c', 'd', 'a')
powróci klawisz 0 zamiast 4.Choć
end()
wydaje się najłatwiejszy, nie jest najszybszy. Szybsza i znacznie silniejsza alternatywa toarray_slice()
:Jak mówią testy , w macierzy z 500 000 elementów jest prawie 7 razy szybsza!
źródło
end($arr);$key = key($arr);reset($arr);
z (b)$key = key(array_slice($arr,-1,1,true));
... co skutkowałoend()
DUŻO szybszym! end () = 0,05326 sekund, array_slice = 8.506 sekund ... huh ??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]; }
last
do ostatniego elementu. Robienieend()
prawie O (1). :-)wolę
źródło
end((array_keys($myarr)))
aby obejść ogłoszenie.Od PHP 7.3 (2018) jest (wreszcie) funkcja do tego: http://php.net/manual/en/function.array-key-last.php
wyjdzie
źródło
Po prostu użyj :
echo $array[count($array) - 1];
źródło
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$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.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.
źródło
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
Oznacza to, że możesz pobrać wartość ostatniego klucza bez:
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 :
Wynik:
Niektóre uwagi:
array_key_last()
jest funkcją rodzeństwa array_key_first () .null
jeśli tablica jest pusta.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 )
źródło
Spróbuj użyć funkcji array_pop i array_keys w następujący sposób:
źródło
array_pop()
działa na wartości zwracanej,array_keys()
a nie na oryginalnej tablicy.Począwszy od PHP> = 7.3
array_key_last()
jest najlepszym sposobem na uzyskanie ostatniego klucza z dowolnej tablicy. Korzystanie z kombinacjiend()
,key()
areset()
tylko po to żeby ostatni klucz tablicy jest oburzające.porównaj to do
Jeśli używasz kombinacji
end()
i, musisz zresetować tablicę, aby wskaźnik znajdował się na początkukey()
źródło
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.
To dałoby ci:
źródło
Możesz użyć tego:
Innym rozwiązaniem jest utworzenie funkcji i użycie jej:
źródło
źródło
Właśnie wziąłem funkcję pomocniczą od Xandera i poprawiłem ją, udzielając odpowiedzi wcześniej:
źródło
Spróbuj tego z
array_reverse()
.źródło
To dziwne, ale dlaczego ten temat nie ma tej odpowiedzi:
$lastKey = array_keys($array)[count($array)-1];
źródło
Działa to, ponieważ PHP przenosi wewnętrznie wskaźnik tablicy dla $ array
źródło
Najlepsze możliwe rozwiązanie, które można zastosować również w linii:
To rozwiązanie jest tylko wyrażeniem / stwierdzeniem i zapewnia dobre, a nie najlepszą możliwą wydajność.
Wstawione przykładowe użycie:
AKTUALIZACJA: W PHP 7.3+: użyj (oczywiście) nowo dodanej
array_key_last()
metody.źródło