Mam tablicę:
array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
Chciałbym uzyskać pierwszy element tej tablicy. Oczekiwany wynik: ciąg apple
Jedno wymaganie: nie można tego zrobić z przekazaniem referencji , więc array_shift
nie jest to dobre rozwiązanie.
W jaki sposób mogę to zrobić?
&$array
działać jako parametry.Odpowiedzi:
Oryginalna odpowiedź, ale kosztowna (O (n)):
W O (1):
Inne przypadki użycia itp.
Jeśli modyfikacja (w sensie resetowania wskaźników tablicy)
$array
nie stanowi problemu, możesz użyć:Powinno to być teoretycznie bardziej wydajne, jeśli potrzebna jest „kopia” tablicy:
W PHP 5.4+ (ale może powodować błąd indeksu, jeśli jest pusty):
źródło
list()
ireset()
są znacznie lepszymi rozwiązaniami do mojej opinii.Jak zauważył Mike (najłatwiejszy możliwy sposób):
Jeśli chcesz zdobyć klucz: (uruchom go po resecie)
Z dokumentacji PHP :
Opis:
źródło
foreach
pomocą tablicy tematów, spieprzysz to.foreach
kopiuje tablicę, przez którą przechodzi.key($arr)
a dostaniesz „4” (dodane do odpowiedzi)reset()
. 2) Nie, foreach NIE tworzy kopii tablicy !!! Tworzy tylko swój własny wskaźnik (nawet nie kopię istniejącego - można go również łatwo sprawdzić, dzwoniącnext()
przed foreach).źródło
Jeśli nie chcesz stracić bieżącej pozycji wskaźnika, po prostu utwórz alias dla tablicy.
źródło
reset()
już zwraca pierwszy element, więc nie trzeba go używaćcurrent()
-echo reset($arr)
powinno wystarczyćcurrent
, abyreset
uniknąć błędów PHP Uwagi / wyprodukowany w przypadkach odniesienia, npcurrent(array_filter(...));
w 3v4l .current($array)
może dostarczyć ci pierwszy element tablicy, zgodnie z instrukcją PHP .To działa, dopóki nie zmienisz położenia wskaźnika tablicy, w przeciwnym razie będziesz musiał zresetować tablicę.
źródło
current($array)
będzie działać tylko wtedy, gdy wskaźnik tablicy „aktualnie” wskazuje na pierwszy element, w przeciwnym raziereset($array)
byłby wymagany.current()
nie wymaga już odniesienia, chociaż dokumenty PHP tego nie odzwierciedlają. Myślę więc, że stało się to najlepszym rozwiązaniem.Możesz uzyskać N-ty element z konstrukcją językową „list”:
Za pomocą tej
array_keys
funkcji możesz zrobić to samo dla klawiszy:źródło
list($first_value) = $my_array;
moim zdaniem najlepsza opcja. Nie ma problemów z innymi przedstawionymi tutaj odpowiedziami: brak „przesady”, ponieważ nie kopiuje ani nie tworzy tablicy ani nie tworzy nowej. Brak „referencji”: tablica nie jest modyfikowana. Brak „resetu”: brak zmian w wewnętrznym wskaźniku tablicy ...int
, spróbuj zrobić,list($firstItem) = array('key1' => 'value1');
a pojawi się błądNotice: Undefined offset: 0
list($x) = foo();
jest równoważne z$x = foo()[0];
. Zauważ, że niekoniecznie musi to być to samo, co „pobierz pierwszy element”, ponieważ nawet tablica indeksowana liczbami całkowitymi może nie mieć elementu z kluczem 0. W moim przypadku robiłem „listę ($ order) = get_order ($ user) ; " ale „get_order” zwracał zamówienia wpisane na podstawie ich identyfikatora, który zwykle nie był równy 0. Jak mówi @Sergiy, array_values () to naprawia, ale pogarsza wydajność i (co ważniejsze) czytelność kodu.PHP 5.4+:
źródło
$array_values = array_values($array); $value = $array_values[0];
PHP 7.3 dodał dwie funkcje do uzyskania pierwszego i ostatniego klucza tablicy bezpośrednio bez modyfikacji oryginalnej tablicy i bez tworzenia jakichkolwiek tymczasowych obiektów:
Oprócz tego, że mają znaczenie semantyczne, funkcje te nawet nie przesuwają wskaźnika tablicy (jak
foreach
by to robił).Posiadając klucze, można uzyskać wartości bezpośrednio po kluczach.
Przykłady (wszystkie wymagają PHP 7.3+)
Uzyskiwanie pierwszego / ostatniego klucza i wartości:
Uzyskiwanie pierwszej / ostatniej wartości jako jednowierszowych, przy założeniu , że tablica nie może być pusta :
Uzyskiwanie pierwszej / ostatniej wartości jako jednowierszowych, z wartościami domyślnymi dla pustych tablic:
źródło
$first_value = $my_array[array_key_first($my_array)] ?? null;
Przypuszczać:
Po prostu użyj:
zdobyć pierwszy element lub
zdobyć pierwszy klucz.
Lub możesz odłączyć pierwszy, jeśli chcesz go usunąć.
źródło
current
?Niektóre tablice nie działają funkcje podoba
list
,reset
albocurrent
. Być może są to „sztuczne” tablice - na przykład częściowo implementujące ArrayIterator.Jeśli chcesz pobrać pierwszą wartość niezależnie od tablicy, możesz zewrzeć iterator:
Twoja wartość będzie wtedy dostępna w
$value
a pętla zostanie przerwana po pierwszej iteracji. Jest to bardziej wydajne niż kopiowanie potencjalnie dużej tablicy do funkcji takiej jak array_unshift (array_values ($ arr)).Możesz także pobrać klucz w ten sposób:
Jeśli wywołujesz to z funkcji, po prostu wróć wcześniej:
źródło
Od pomocników Laravela :
Tablica przekazywana przez wartość do funkcji, reset () wpływa na wewnętrzny wskaźnik kopii tablicy i nie dotyka oryginalnej tablicy (zwróć uwagę, że zwraca
false
jeśli tablica jest pusta).Przykład użycia:
Również tutaj jest alternatywa. Jest bardzo nieznacznie szybszy, ale bardziej interesujący. Pozwala łatwo zmienić wartość domyślną, jeśli tablica jest pusta:
Dla przypomnienia, oto moja kolejna odpowiedź na ostatni element tablicy.
źródło
Niech to będzie proste! Istnieje wiele poprawnych odpowiedzi, ale aby zminimalizować zamieszanie, te dwa działają i zmniejszają koszty ogólne:
key($array)
pobiera pierwszy klucz tablicycurrent($array)
pobiera pierwszą wartość tablicyEDYCJA:
W odniesieniu do poniższych komentarzy. Wyjdzie następujący przykład:
string(13) "PHP code test"
źródło
current
równa się bieżącemu elementowi. Musisz zresetować wskaźnik do początku tablicy, aby upewnić się, że rzeczywiście znajduje się na początku.Po prostu wykonaj:
źródło
Zrobiłbym
echo current($array)
.źródło
current()
nie powoduje błędu przy przekazywaniu niereferencji . Pod warunkiem, że wskaźnik jest nadal na początku, działa to.reset
generuje powiadomienie „Tylko zmienne powinny być przekazywane przez odniesienie”, podczas gdycurrent
nie: Przykład edytora PHP onlinecurrent(array_filter(...));
.next()
,end()
lub jakiejkolwiek innej funkcji, która modyfikuje wewnętrzny wskaźnik tablicy. W moim przykładziecurrent()
zwraca null, ponieważ wewnętrzny wskaźnik jest „poza zakresem” tablicy. Ale może „wirtualnie” wskazywać również na dowolny / losowy element.Wynik:
źródło
źródło
Jest to o wiele bardziej wydajne niż
array_values()
ponieważeach()
funkcja nie kopiuje całej tablicy.Aby uzyskać więcej informacji, zobacz http://www.php.net/manual/en/function.each.php
źródło
because the each() function does not copy the entire array.
+1Kludgy sposób to:
źródło
reset()
ponieważ wskaźnik tablicy jest resetowany przedforeach
wywołaniem.Zdobądź pierwszy element:
Zdobądź ostatni element
źródło
Większość z nich działa! ALE dla szybkiego połączenia z jedną linią (mało zasobów):
Chociaż to działa i całkiem dobrze, proszę zobaczyć moją dodatkową odpowiedź: https://stackoverflow.com/a/48410351/1804013
źródło
current($array)
, które wymaga, aby wewnętrzny wskaźnik tablicy znajdował się na pierwszym elemencie, w którym to przypadkuecho reset($array)
jest najbardziej odpowiedni.Myślę, że najlepszym rozwiązaniem byłoby użycie array_values . Możesz zwrócić wartość o indeksie zero od wyniku tej funkcji, aby uzyskać „jabłko”.
źródło
Trochę za późno na grę, ale pojawił się problem polegający na tym, że moja tablica zawierała elementy tablicy jako dzieci, a zatem nie mogłam po prostu uzyskać reprezentacji ciągu pierwszego elementu tablicy. Przez użyciem PHP
current()
funkcji , to udało mi:Dzięki wszystkim obecnym rozwiązaniom pomógł mi dojść do tej odpowiedzi, mam nadzieję, że kiedyś to komuś pomoże!
źródło
Posługiwać się:
Domyślnie
array_slice
nie zachowuje kluczy, więc możemy bezpiecznie używać zera jako indeksu.źródło
Dwa rozwiązania dla Ciebie.
Rozwiązanie 1 - Wystarczy użyć klucza. Nie powiedziałeś, że nie możesz go użyć. :)
Rozwiązanie 2 - array_flip () + key ()
Rozwiązanie 3 - array_keys ()
źródło
To nie jest taka prosta reakcja w prawdziwym świecie. Załóżmy, że mamy te przykłady możliwych odpowiedzi, które można znaleźć w niektórych bibliotekach.
Jak widać, mamy kilka rozwiązań „jednowierszowych”, które działają dobrze w niektórych przypadkach, ale nie we wszystkich.
Moim zdaniem ten moduł obsługi powinien mieć tylko tablice.
Teraz mówimy o wydajności, zakładając, że zawsze mamy tablicę, w następujący sposób:
array_shift
jest szybszy niżreset
, czyli szybszy niż [count () - 1], a te trzy są szybsze niżarray_values
iarray_slice
.źródło
Wyobrażam sobie, że autor szukał sposobu na uzyskanie pierwszego elementu tablicy po uzyskaniu go z jakiejś funkcji ( na przykład mysql_fetch_row ) bez generowania STRICT „Tylko zmienne powinny być przekazywane przez referencję”.
Jeśli tak, prawie wszystkie opisane tutaj sposoby otrzymają ten komunikat ... a niektóre z nich wykorzystują dużo dodatkowej pamięci powielającej tablicę (lub jej część). Łatwym sposobem na uniknięcie tego jest przypisanie wartości inline przed wywołaniem którejkolwiek z tych funkcji:
W ten sposób nie wyświetla się komunikat STRICT na ekranie ani w dziennikach i nie tworzy się żadnych dodatkowych tablic. Działa zarówno z tablicami indeksowanymi, jak i asocjacyjnymi.
źródło
Podoba mi się przykład „lista”, ale „lista” działa tylko po lewej stronie zadania. Jeśli nie chcemy przypisywać zmiennej, bylibyśmy zmuszeni stworzyć tymczasową nazwę, która w najlepszym razie zanieczyszcza nasz zakres, aw najgorszym przypadku zastępuje istniejącą wartość:
Powyższe zastąpi istniejącą wartość $ x, a zmienna $ x będzie się zawieszać, dopóki ten zakres będzie aktywny (koniec tej funkcji / metody, lub na zawsze, jeśli będziemy na najwyższym poziomie). Można to obejść za pomocą call_user_func i anonimowej funkcji, ale jest niezręczna:
Jeśli użyjemy takich anonimowych funkcji, będziemy w stanie uciec od resetowania i array_shift, nawet jeśli używają pass-by-referencji. Wynika to z tego, że wywołanie funkcji wiąże jej argumenty, a argumenty te można przekazać przez odwołanie:
Jest to jednak w rzeczywistości przesada, ponieważ call_user_func wykona to tymczasowe zadanie wewnętrznie. Pozwala to traktować funkcje przekazywania według referencji tak, jakby były wartościami przekazywanymi bez wartości ostrzegawczych lub błędów:
źródło
Mała zmiana w tym, co opublikował Sarfraz, to:
źródło
Nie lubię majstrować przy wewnętrznym wskaźniku tablicy, ale również nieefektywne jest budowanie drugiej tablicy za pomocą
array_keys()
lubarray_values()
, więc zwykle definiuję to:źródło
Spróbuj tego:
źródło