Piszę kreatora zapytań SQL przy użyciu niektórych parametrów. W Javie bardzo łatwo jest wykryć ostatni element tablicy z wnętrza pętli for, po prostu sprawdzając bieżącą pozycję tablicy z długością tablicy.
for(int i=0; i< arr.length;i++){
boolean isLastElem = i== (arr.length -1) ? true : false;
}
W PHP mają indeksy niecałkowite umożliwiające dostęp do tablic. Musisz więc iterować tablicę za pomocą pętli foreach. Staje się to problematyczne, gdy musisz podjąć jakąś decyzję (w moim przypadku, aby dołączyć lub / i parametr podczas budowania zapytania).
Jestem pewien, że musi istnieć jakiś standardowy sposób na zrobienie tego.
Jak rozwiązujesz to w PHP?
Odpowiedzi:
Wygląda na to, że chcesz czegoś takiego:
To powiedziawszy, nie musisz iterować po „tablicy” przy użyciu
foreach
PHP.źródło
$numItems = count($arr)
trick nie jest potrzebny i zmniejsza czytelność - w PHP nie ma ograniczenia wydajności za dostęp do count ($ arr) za każdym razem. Powodem jest to, że liczba elementów jest zapisywana wewnętrznie jako specjalne pole w nagłówku tablicy i nie jest obliczana na bieżąco. Ta sztuczka pochodzi z innych języków (C, Java?, ...).Możesz uzyskać wartość ostatniego klucza tablicy za pomocą
end(array_keys($array))
i porównać ją z bieżącym kluczem:źródło
$lastKey = array_search(end($array), $array);
dlaczego tak skomplikowane?
Spowoduje to dodanie za każdą wartością oprócz ostatniej!
źródło
Kiedy toEnd osiągnie 0, oznacza to, że jest na ostatniej iteracji pętli.
Ostatnia wartość jest nadal dostępna po pętli, więc jeśli chcesz użyć jej do innych rzeczy po pętli, lepiej:
Jeśli nie chcesz traktować ostatniej wartości jako specjalnych pętli wewnętrznych. Powinno to być szybsze, jeśli masz duże tablice. (Jeśli ponownie użyjesz tablicy po pętli w tym samym zakresie, musisz najpierw „skopiować” tablicę).
I aby odpowiedzieć na twoje pierwotne pytanie „w moim przypadku, aby dołączyć lub / i parametr podczas budowania zapytania”; spowoduje to zapętlenie wszystkich wartości, a następnie połączenie ich razem w ciąg znaków z „i” między nimi, ale nie przed pierwszą wartością lub po ostatniej wartości:
źródło
$lastValue = array_pop($array);
Dziękuję Ci.Istnieje już wiele odpowiedzi, ale warto również zajrzeć do iteratorów, zwłaszcza, że poproszono o standardowy sposób:
Możesz znaleźć coś, co działa bardziej elastycznie, również w innych przypadkach.
źródło
i=0;
i++i;
zawsze wydawały się hackerskie w języku skryptowym takim jak PHP.Jednym ze sposobów może być wykrycie, czy iterator ma
next
. Jeśli do iteratora nie jest dołączone następne, oznacza to, że jesteś w ostatniej pętli.źródło
Jeśli więc twoja tablica ma unikalne wartości, to określenie ostatniej iteracji jest banalne:
Jak widać, działa to, jeśli ostatni element pojawia się tylko raz w tablicy, w przeciwnym razie pojawi się fałszywy alarm. W tym przypadku nie trzeba porównywać kluczy (które na pewno są unikalne).
Zwróć też uwagę na operatora ścisłej kopii, co w tym przypadku jest dość ważne.
źródło
Zakładając, że macie tablicę zapisaną w zmiennej ...
źródło
aby uzyskać pierwszy i ostatni element z tablicy foreach
źródło
Nadal możesz używać tej metody z tablicami asocjacyjnymi:
źródło
Jeśli musisz zrobić coś dla każdego elementu oprócz pierwszego lub ostatniego i tylko jeśli w tablicy jest więcej niż jeden element, wolę następujące rozwiązanie.
Wiem, że istnieje wiele rozwiązań powyżej i opublikowanych miesiąc / rok przed moim, ale wydaje mi się, że jest to dość eleganckie samo w sobie. Sprawdzanie każdej pętli jest również czekiem logicznym w przeciwieństwie do czeku numerycznego „i = (count-1)”, który może pozwolić na mniejszy narzut.
Struktura pętli może wydawać się niewygodna, ale można ją porównać z kolejnością thead (początek), tfoot (koniec), tbody (bieżący) w znacznikach tabeli HTML.
Na przykład, jeśli chodzi o tworzenie stron internetowych, jeśli chcesz dodać obramowanie do każdego elementu oprócz ostatniego na liście nieuporządkowanej (ul), możesz zamiast tego dodać obramowanie do każdego elementu oprócz pierwszego (CSS: first-child, obsługiwane przez IE7 + i Firefox / Webkit obsługuje tę logikę, podczas gdy: last-child nie jest obsługiwane przez IE7).
Możesz również ponownie użyć zmiennej $ first dla każdej zagnieżdżonej pętli, a wszystko będzie działać dobrze, ponieważ każda pętla powoduje, że $ first jest fałszywe podczas pierwszego procesu pierwszej iteracji (więc przerwy / wyjątki nie powodują problemów) .
Przykładowe dane wyjściowe:
źródło
To powinien być łatwy sposób na znalezienie ostatniego elementu:
Odniesienie: Link
źródło
Mam silne przeczucie, że u podstaw tego „problemu XY” OP chciał po prostu
implode()
działać.źródło
Ponieważ Twoim celem znalezienia tablicy EOF jest tylko klej. Zapoznaj się z poniższą taktyką. Nie musisz wymagać EOF:
o / p:
źródło
Co powiesz na użycie „końca”? http://php.net/manual/en/function.end.php
źródło
Wygląda na to, że chcesz czegoś takiego:
źródło
Nie dodawaj przecinka po ostatniej wartości:
Tablica:
Funkcja:
Wynik:
Lorem ipsum dolor sit amet
źródło
możesz wykonać count ().
lub jeśli szukasz TYLKO ostatniego elementu, możesz użyć end ().
zwraca tylko ostatni element.
i, jak się okazuje, MOŻESZ indeksować tablice php według liczb całkowitych. Jest całkowicie zadowolony
źródło
$a = array(0=>'A', 2=>'B', 'aaa'=>'C')
. Co otrzymasz, jeśli uzyskasz dostęp$a[count($a)-1]
?Możesz także zrobić coś takiego:
źródło
Podobają mi się następujące, ponieważ uważam, że jest dość schludny. Załóżmy, że tworzymy ciąg z separatorami między wszystkimi elementami: np. A, b, c
źródło
Odniesienie
źródło
Oto inny sposób, w jaki możesz to zrobić:
źródło
Jeśli cię rozumiem, wystarczy odwrócić tablicę i pobrać ostatni element za pomocą polecenia pop:
źródło
Możesz także spróbować wykonać zapytanie ... pokazane tutaj za pomocą INSERT
źródło
W przypadku skryptów generujących zapytania SQL lub czegokolwiek, co wykonuje inną akcję dla pierwszego lub ostatniego elementu, jest znacznie szybsze (prawie dwa razy szybsze), aby uniknąć niepotrzebnego sprawdzania zmiennych.
Obecnie akceptowane rozwiązanie wykorzystuje pętlę i sprawdzanie w pętli, które będzie wykonywane co każde pojedyncze sformułowanie, poprawny (szybki) sposób na wykonanie tego jest następujący:
Mały domowy test porównawczy pokazał, co następuje:
test1: 100000 serii modelu Morg
czas: 1869.3430423737 milisekund
test2: 100000 serii modelu, jeśli ostatnia
czas: 3235.6359958649 milisekund
źródło
Innym sposobem jest zapamiętanie wyniku poprzedniego cyklu pętli i wykorzystanie go jako wyniku końcowego:
źródło
Osobiście korzystam z tego rodzaju konstrukcji, które umożliwiają łatwe korzystanie z elementów html <ul> i <li>: wystarczy zmienić równość dla innej właściwości ...
Tablica nie może zawierać fałszywych elementów, ale wszystkie inne elementy, które są rzutowane na fałszywe wartości logiczne.
źródło
Ostatni indeks możesz uzyskać bezpośrednio:
$numItems = count($arr);
echo $arr[$numItems-1];
źródło
źródło
Oto moje rozwiązanie: Po prostu uzyskaj liczbę tablic minus 1 (ponieważ zaczynają się od 0).
źródło