Ok,
Wiem wszystko array_pop()
, ale to usuwa ostatni element. Jaki jest najlepszy sposób na uzyskanie ostatniego elementu tablicy bez usuwania go?
EDYCJA: Oto bonus:
$array = array('a' => 'a', 'b' => 'b', 'c' => 'c');
lub nawet
$array = array('a', 'b', 'c', 'd');
unset($array[2]);
echo $array[sizeof($array) - 1]; // Output: PHP Notice: Undefined offset: 2 in - on line 4
Odpowiedzi:
Wiele odpowiedzi w tym wątku przedstawia nam wiele różnych opcji. Aby móc z nich wybierać, musiałem zrozumieć ich zachowanie i wydajność. W tej odpowiedzi będę dzielić się z wami moimi odkryciami, na podstawie porównania z wersjami PHP
5.6.38
,7.2.10
i7.3.0RC1
( oczekiwano 13 grudnia 2018 ).Opcje
<<option code>>
, które przetestuję, to:$x = array_values(array_slice($array, -1))[0];
( Jak sugerowano przez rolacja )$x = array_slice($array, -1)[0];
( Jak sugerowano przez Stoutie )$x = array_pop((array_slice($array, -1)));
( Jak sugerowano przez rolacja )$x = array_pop((array_slice($array, -1, 1)));
( Jak sugerowano przez Westy92 )$x = end($array); reset($array);
( Jak sugerowano przez Iznogood )$x = end((array_values($array)));
( Jak sugerowano przez TecBrat )$x = $array[count($array)-1];
( Jak sugerowano przez Mirko Pagliai )$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
( Jak sugerowano przez thrau )$x = $array[] = array_pop($array);
( Jak sugerowano przez user2782001 )$x = $array[array_key_last($array)];
( jak sugerowano przez klon Quasimodo jest ; dostępny na PHP 7.3)(wspomniane funkcje: array_key_last , array_keys , array_pop , array_slice , array_values , count , end , reset )
Wejścia testowe
<<input code>>
do połączenia z:$array = null;
$array = [];
$array = ["a","b","c",null];
$array = ["a","b","c","d"];
$array = []; $array[1] = "a"; $array[2] = "b"; $array[0] = "c";
$array = []; for($i=0;$i<100;$i++) { $array[] = $i; }
$array = []; for($i=0;$i<100000;$i++) { $array[] = $i; }
Do testowania będę używać
5.6.38
,7.2.10
i7.3.0RC1
PHP pojemniki dokowane jak:Każda kombinacja wyżej wymienionych
<<option code>>
s i<<input code>>
s będzie działać na wszystkich wersjach PHP. Do każdego uruchomienia testowego używany jest następujący fragment kodu:Dla każdego przebiegu spowoduje to var_dump ostatnio pobraną ostatnią wartość wejścia testowego i wydrukowanie średniego czasu trwania jednej iteracji w femtosekundach (0,000000000000001 000 sekundy).
Wyniki są następujące:
Wyżej wymienione kody F atal, W arning i N otice tłumaczą się następująco:
Na podstawie tych wyników wyciągam następujące wnioski:
$x = end((array_values($array)));
$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
$x = end($array); reset($array);
$x = $array[count($array)-1];
$x = $array[] = array_pop($array);
$x = $array[array_key_last($array)];
(od PHP 7.3)$x = $array[count($array)-1];
(z powodu użyciacount
)$x = $array[] = array_pop($array);
(z powodu przypisania utraconego klucza oryginalnego)$x = end($array); reset($array);
$x = end((array_values($array)));
array_key_last
wydaje się, że nowa funkcja nie ma żadnego z wyżej wymienionych ograniczeń, z wyjątkiem tego, że w chwili pisania tego tekstu nadal jest RC (więc użyj RC lub poczekaj na wydanie Gru 2018):$x = $array[array_key_last($array)];
(od PHP 7.3)Nieco w zależności od tego, czy używasz tablicy jako stosu, czy jako kolejki , możesz wprowadzać zmiany w opcji 9.
źródło
$array[array_key_last($array)];
do twojego testu porównawczego. Po zakończeniu proszę o powiadomienie. Chciałbym zobaczyć wyniki wydajności w porównaniu.Próbować
Aby go zresetować (dzięki @hopeseekr):
Link do instrukcji
@David Murdoch dodał:
$myLastElement = end(array_values($yourArray));// and now you don't need to call reset().
Na E_STRICT generuje to ostrzeżenieDzięki o_O Tync i wszystkim!
źródło
$myLastElement = end(array_values($yourArray));
a teraz nie musisz dzwonićreset()
.end(array_values())
da E_STRICT: „Tylko zmienne powinny być przekazywane przez referencję”end((array_values($yourArray)))
Krótkie i słodkie.
Wymyśliłem rozwiązanie, aby usunąć komunikat o błędzie i zachować formę jednowarstwową i wydajną wydajność:
- poprzednie rozwiązanie
Uwaga: dodatkowe nawiasy są potrzebne, aby uniknąć
PHP Strict standards: Only variables should be passed by reference
.źródło
$array = array_slice($array, -1); $lastEl = array_pop($array);
Osobiście uważam, że jest to lepsze (bez parsera „błędu”)array_size() > 1
2. Sprawdź, czy tablica faktycznie jest tablicą. Nadal trzymam się odpowiedzi @Iznogood, ponieważ wbudowanaend()
funkcja PHP wykonuje całą ciężką pracę w bardziej wydajny sposób.Co jest nie tak z
array_slice($array, -1)
? (Patrz Podręcznik: http://us1.php.net/array_slice )array_slice()
zwraca tablicę. Prawdopodobnie nie to, czego szukasz. Chcesz tego elementu.źródło
array_slice($array, -1)[0]
aby uzyskać element.reset(array_slice($array, -1))
to inne podejście (nie spowoduje błędu, jeśliarray_slice()
zwróci coś „mniejszego” niż tablica jednoelementowa)array_slice($array, -1)[0] = "";
Jednym ze sposobów uniknięcia błędów przekazywania przez odwołanie (np. „End (wartości_szablonu ($ foo))”) jest użycie call_user_func lub call_user_func_array:
źródło
end((array_values($yourArray)))
call_user_func
sztuczka nie działa również w PHP 7. Myślę, że utknąłeś z tworzeniem zmiennej tymczasowej.Jeśli nie chcesz modyfikować wskaźnika wewnętrznego (obsługuje zarówno tablice indeksowane, jak i asocjacyjne):
Jeśli potrzebujesz funkcji narzędzia, która nie modyfikuje wewnętrznego wskaźnika (ponieważ tablica jest przekazywana przez wartość, a funkcja działa na jej kopii):
Zauważ, że PHP produkuje kopie „w locie”, tj. Tylko wtedy, gdy są rzeczywiście potrzebne.
end()
Sam zmienia tablicy więc wewnętrznie kopia tablicy jest generowany.Zatem następująca alternatywa jest w rzeczywistości szybsza, ponieważ wewnętrznie nie kopiuje tablicy, po prostu tworzy plasterek:
Ten „foreach / return” to poprawka do skutecznego zdobycia pierwszego (i tutaj pojedynczego) przedmiotu.
Wreszcie najszybsza alternatywa, ale tylko dla indeksowanych tablic:
Dla przypomnienia, oto moja kolejna odpowiedź na pierwszy element tablicy.
źródło
array_last
funkcji. Po pierwsze stwierdzasz, że$array
jest on kopiowany, a po drugie, że nie jest kopiowany. Gdzie jest różnica / dlaczego jest kopiowana w pierwszym wdrożeniu, a nie w drugim?niesprawdzone: czy to nie zadziała?
Ponieważ tablica zwracana przez array_values jest ulotna, nikogo to nie obchodzi, jeśli jej wskaźnik zostanie zresetowany.
i jeśli potrzebujesz klucza, aby to zrobić, myślę, że zrobiłbyś:
źródło
Potrzebuję tego dość często, aby radzić sobie ze stosami, i zawsze jestem zaskoczony, że nie ma natywnej funkcji, która by to zrobiła bez manipulowania tablicą lub jej wewnętrznym wskaźnikiem w jakiejś formie.
Więc zwykle noszę funkcję util, która jest również bezpieczna w przypadku tablic asocjacyjnych.
źródło
Aby uzyskać ostatni element tablicy, użyj:
Reper
Ierowałem 1000 razy, chwytając ostatni element małych i dużych tablic, które zawierały odpowiednio 100 i 50 000 elementów.
Użyłem PHP w wersji 5.5.32.
źródło
end () dostarczy ostatni element tablicy
źródło
Od wersji PHP 7.3 funkcje
array_key_first
iarray_key_last
zostały wprowadzone.Ponieważ tablice w PHP nie są ścisłymi typami tablic, tj. Kolekcjami o stałych rozmiarach pól o stałej wielkości, zaczynającymi się od indeksu 0, ale dynamicznie rozszerzaną tablicą asocjacyjną, obsługa pozycji z nieznanymi kluczami jest trudna, a obejścia nie działają zbyt dobrze. Natomiast prawdziwe tablice byłyby bardzo szybko wewnętrznie adresowane za pomocą arytmetyki wskaźników, a ostatni indeks jest już znany w czasie kompilacji poprzez deklarację.
Przynajmniej problem z pierwszą i ostatnią pozycją jest rozwiązany przez wbudowane funkcje od wersji 7.3. Działa to nawet bez ostrzeżeń na literałach tablic po wyjęciu z pudełka:
Oczywiście ostatnia wartość to:
źródło
Nie dokonuje się modyfikacji wskaźników $ tablicowych. Pozwala to uniknąć
co może nie być pożądane w pewnych warunkach.
źródło
Dla mnie:
Dzięki inicjatywom:
źródło
Najlepsze odpowiedzi są świetne, ale jak wspomnieli @ paul-van-leeuwen i @ quasimodos-clone, PHP 7.3 wprowadzi dwie nowe funkcje bezpośredniego rozwiązania tego problemu - array_key_first () i array_key_last () .
Możesz zacząć korzystać z tej składni już dziś z następującymi funkcjami wypełniania (lub podkładki).
Uwaga: Wymaga PHP 5.4 lub nowszego.
źródło
Aby to zrobić i uniknąć E_STRICT i nie zadzierać z wewnętrznym wskaźnikiem tablicy, możesz użyć:
lelement działa tylko z kopią, więc nie wpływa na wskaźnik tablicy.
źródło
Inne rozwiązanie:
źródło
Jeszcze jedno możliwe rozwiązanie ...
źródło
Co powiesz na:
$array == []
(zwracafalse
)źródło
Ostatni element z tablicy uzyskasz łatwo, korzystając z poniższej logiki
Nie tylko ostatni element, ale możesz także uzyskać drugi, trzeci i tak dalej, korzystając z poniższej logiki.
dla drugiego ostatniego elementu musisz przekazać tylko cyfrę 2 w powyższej instrukcji, na przykład:
echo ($ array [count ($ array) -2]);
źródło
Aby uzyskać ostatnią wartość z tablicy:
W celu usunięcia tablicy ostatniej wartości:
źródło
array_slice($arr,-1,1)
spowoduje kolejną tablicę o długości 1, a nie ostatni element$a=array("red","green","blue","yellow","brown"); print_r(array_slice($a,-1,1));
Wynik:Array ( [0] => brown )
Po prostu:
$last_element = end((array_values($array)))
Nie resetuje tablicy i nie wyświetla ostrzeżeń typu STRICT.
PS. Ponieważ najczęściej głosowana odpowiedź wciąż nie ma podwójnego nawiasu, przesłałem tę odpowiedź.
źródło
Myślę, że jest to niewielka poprawa w stosunku do wszystkich istniejących odpowiedzi:
end()
przy użyciu rozwiązańarray_keys()
, szczególnie przy dużych tablicachźródło
array_values
do wycinka z jednym elementem)Użyj funkcji end ().
źródło
W dzisiejszych czasach wolałbym zawsze mieć tego pomocnika, jak sugerowano w odpowiedzi na php.net/end .
Dzięki temu wskaźnik pozostanie niezmieniony i nigdy nie będziemy musieli martwić się nawiasami, ścisłymi standardami lub czymkolwiek innym.
źródło
Uwaga: Dla (PHP 7> = 7.3.0) możemy użyć array_key_last - Pobiera ostatni klucz tablicy
Patrz: http://php.net/manual/en/function.array-key-last.php
źródło
Co jeśli chcesz umieścić ostatni element tablicy w pętli jego tablicy?
Poniższy kod spowoduje powstanie nieskończonej pętli:
Rozwiązanie jest oczywiście proste w przypadku tablic niekojarzonych:
źródło
źródło
Począwszy od PHP 7.3,
array_key_last
jest dostępnyźródło
Bardzo prosta
źródło
$a = array(); $a[2] = 'c'; $a[1] = 'b'; echo end($a);
powrócib
moje proste rozwiązanie, ładne i łatwe do zrozumienia.
źródło