Jaki jest najlepszy sposób ustalenia pierwszego klucza w potencjalnie asocjacyjnej tablicy? Najpierw pomyślałem, że po prostu przewidziełem tablicę, a potem natychmiast ją złamałem, tak:
foreach ($an_array as $key => $val) break;
Zatem posiadanie klucza $ zawiera pierwszy klucz, ale wydaje się to nieefektywne. Czy ktoś ma lepsze rozwiązanie?
foreach
jest semantycznie błędny.each($arr)['key']
alboeach($arr)[0]
będzie działać.0.0107
0.0217
Odpowiedzi:
Aktualizacja 2019
Począwszy od PHP 7.3 pojawiła się nowa wbudowana funkcja o nazwie,
array_key_first()
która pobierze pierwszy klucz z podanej tablicy bez resetowania wewnętrznego wskaźnika. Sprawdź dokumentację, aby uzyskać więcej informacji.Możesz użyć
reset
ikey
:Zasadniczo jest taki sam jak początkowy kod, ale ma nieco mniejszy narzut i bardziej oczywiste jest, co się dzieje.
Pamiętaj tylko, aby zadzwonić
reset
, w przeciwnym razie możesz dostać dowolny klucz z tablicy. Możesz także użyćend
zamiast,reset
aby uzyskać ostatni klucz.Jeśli chcesz, aby klucz uzyskał pierwszą wartość,
reset
faktycznie ją zwraca:Jest jednak jeden szczególny przypadek, na który należy uważać (więc najpierw sprawdź długość tablicy):
źródło
reset()
zdarza się również, że zwraca pierwszy element (wartość, a nie klucz) z dowolnej tablicy, co również może być przydatne.reset()
powiedzeniaDon't use
reset () `, aby uzyskać pierwszą wartość tablicy asocjacyjnej. Działa świetnie dla prawdziwych tablic, ale działa nieoczekiwanie na obiektach Iterator. bugs.php.net/bug.php?id=38478 `Czy to nadal prawda? Jestem zdezorientowanyarray
obiektach, ale o obiektach niestandardowych (które nie są rzeczywistymi tablicami). Sądzę, że pomylili różnice w strukturach danych, ale w zasadziereset
zwraca wartość pierwszego „klucza”, który dla obiektów byłby$prop
w przykładzie podanym w raporcie „błędu”, ale dla tablicy pierwszy klucz. Więc nie martw się, dopóki używasz prawdziwych tablic (utworzonych przy pomocyarray(…)
), nie będziesz mieć problemu.next
,reset
,end
lub pętli w tablicy), nie dostaniesz wartość oczekiwaną podczas rozmowykey
. Tak, zawsze zadzwońreset
przed użyciem,key
aby upewnić się, że dostaniesz to, czego chcesz.array_keys
zwraca tablicę kluczy. Weź pierwszy wpis. Alternatywnie możesz wywołaćreset
tablicę, a następniekey
. To drugie podejście jest prawdopodobnie nieco szybsze (nie testowałem go), ale ma efekt uboczny resetowania wewnętrznego wskaźnika.źródło
foreach
+break
ireset
+key
. Ale ten pierwszy wygląda dość dziwnie, więc ze względów stylistycznych wolałbym ten drugi.foreach
że nie tworzy dla niej wewnętrznej kopii, a jedynie iteruje wskaźnik , podobnie jak przy użyciu więcej niskiego poziomunext
,current
itdCo ciekawe, pętla foreach jest w rzeczywistości najbardziej efektywnym sposobem na zrobienie tego.
Ponieważ PO konkretnie zapytał o efektywność, należy zauważyć, że wszystkie obecne odpowiedzi są w rzeczywistości znacznie mniej skuteczne niż foreach.
Zrobiłem test porównawczy na php 5.4, a metoda reset / wskaźnik klucza (zaakceptowana odpowiedź) wydaje się być około 7 razy wolniejsza niż foreach. Inne podejścia do manipulowania całą tablicą (array_keys, array_flip) są oczywiście jeszcze wolniejsze i stają się znacznie gorsze podczas pracy z dużą tablicą.
Foreach wcale nie jest nieefektywny, możesz go używać!
Edytuj 2015-03-03:
Zażądano skryptów testowych, nie mam oryginalnych, ale wykonałem kilka nowych testów. Tym razem znalazłem foreach tylko około dwa razy szybciej niż reset / klucz. Użyłem tablicy 100-klawiszowej i każdą metodę milion razy uruchomiłem, aby uzyskać zauważalną różnicę, oto kod prostego testu porównawczego:
Na moim php 5.5 ten wynik:
reset + klucz http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs
źródło
foreach
nigdy nie kopiuj tablicy, chyba że zmodyfikujesz ją bezpośrednio w pętli foreach. Na php5 struktura tablicy może być kopiowana w niektórych przypadkach (gdy jej przelicznik> 1) i masz rację, może to mieć znaczący wpływ. Na szczęście nie ma się czym martwić na php7, gdzie problem został rozwiązany. Oto świetna lektura zarówno o tym, jak działa foreach teraz, jak i o przeszłości.key($an_array)
da ci pierwszy kluczedit per Blixt: powinieneś zadzwonić
reset($array);
przed,key($an_array)
aby zresetować wskaźnik do początku tablicy.źródło
Możesz spróbować
źródło
W wersji 2018+
Począwszy od wersji PHP 7.3 istnieje
array_key_first()
funkcja, która osiąga dokładnie to:Dokumentacja jest dostępna tutaj . 😉
źródło
źródło
Jeśli wydajność nie jest dla Ciebie tak ważna, możesz użyć
array_keys($yourArray)[0]
w PHP 5.4 (i wyższych).Przykłady:
Przewaga nad rozwiązaniem:
jest to, że możesz przekazać
array_keys($arr)[0]
jako parametr funkcji (tjdoSomething(array_keys($arr)[0], $otherParameter)
.).HTH
źródło
array_keys($arr)[0]
składnia jest poprawna?array dereferencing
. Patrz na przykład: schlueters.de/blog/archives/…Proszę znaleźć następujące:
Przykład roboczy:
źródło
źródło
max()
dawka nie zwraca pierwszego klucza tablicy assoc. maksymalny zwrot maksymalnej wartości listy lub elementów tablicyMoże to być również rozwiązanie:
Przetestowałem to i działa.
Kodeks roboczy .
źródło
Aby ulepszyć rozwiązanie Webmut , dodałem następujące rozwiązanie:
Dane wyjściowe dla mnie w PHP 7.1 to:
Jeśli zrobię to dla tablicy o rozmiarze 10000, wyniki będą
Upłynął limit czasu metody array_keys po 30 sekundach (przy zaledwie 1000 elementów czas pozostałej części był mniej więcej taki sam, ale metoda array_keys miała około 7,5 sekundy).
źródło
źródło
Najlepszy sposób, który dla mnie zadziałał, to
array_keys
pobiera tablicę kluczy z tablicy początkowej, a następniearray_shift
wycina z niej wartość pierwszego elementu. W tym celu potrzebujesz PHP 5.4+.źródło
To jest łatwiejszy sposób, jaki kiedykolwiek znalazłem. Szybki i tylko dwie linie kodu :-D
źródło
php73:
http://php.net/manual/en/function.array-key-first.php
źródło
Jednowarstwowy:
źródło
Dzisiaj musiałem poszukać pierwszego klucza mojej tablicy zwróconego przez żądanie POST. (I zanotuj numer identyfikatora formularza itp.)
Znalazłem to: Zwraca pierwszy klucz tablicy asocjacyjnej w PHP
http://php.net/key
Zrobiłem to i działa.
Może będzie to eko 15 minut od innego faceta. CYA.
źródło
Możesz grać ze swoją tablicą
Aby uzyskać pierwszy element tablicy, którego możesz użyć,
current
a dla ostatniego elementu możesz użyćend
Edytować
Żeby nie otrzymywać więcej głosów za odpowiedź, możesz przekonwertować klucz na wartość, używając
array_keys
i wykorzystując, jak pokazano powyżej.źródło