![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 600 Pomógł: 2 Dołączył: 1.09.2002 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Mam tablice generowaną automatycznie, jednak potrzebuje, żeby nie miała ona więcej niż 5 elementów. Podczas dodawania elementu do tablicy sprawdzam, czy ma powyżej 5 elementów i jeżeli ma to kasuje je funkcją array_shift(); Po ciężkiej walce okazało się, że array_shift() modyfikuje mi klucze pozostałych tablic... W jaki sposób mogę kontrolować czy tablica ma 5 elementów.. i kasować najstarszy? Myślałem o pętli foreach(), ale może jest jakis wbudowany w php mechanizm? |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Po ciężkiej walce okazało się, że array_shift() modyfikuje mi klucze pozostałych tablic... Tego nie do końca rozumiem, ale może coś takiego Ci pomoże:-------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Wyciągnij 4 elementy, z pominięciem pierwszego używając array_slice i zachowując klucze, czyli z wykorzystaniem WSZYSTKICH parametrów tej funkcji
![]() Tylko użyć count, który sprawdza czy tablica ma więcej niż 5 elementów i jeśli tak, to robi array_slice według tego co powżej i dokłada nowy element tablicy ![]() EDIT: @up... za dużo zachodu, to co pokazałeś to: resetuje wskaźnik tablicy, czyli ustawia na pierwszym, potem sprawdza nazwę klucza i na koniec robi usunięcie elementu tablicy o takim kluczu. Za dużo motania.
Powód edycji: [thek]: Wytłumaczenie koledze co robi jego kod ;)
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 600 Pomógł: 2 Dołączył: 1.09.2002 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Tego nie do końca rozumiem, ale może coś takiego Ci pomoże: Array_shift() kasuje pierwszy element tablicy, ale modyfikuje klucze tablic tak, żeby zaczynały się od 0.. co powoduje rozsypanie całego skryptu.. reset($array); $key = key($array); unset($array[$key]); musze to wypróbować.. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
EDIT: @up... za dużo zachodu, to co pokazałeś to: resetuje wskaźnik tablicy, czyli ustawia na pierwszym, potem sprawdza nazwę klucza i na koniec robi usunięcie elementu tablicy o takim kluczu. Za dużo motania. Myślisz, że bym wklejał kod, który nie wiem co robi? ![]() ![]() -------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Na szybko:
Z wynikiem: Kod 100k razy z resetem = 2.9823479652405 -> Array ( [99995] => ggsggstr [99996] => ggsggstr [99997] => ggsggstr [99998] => ggsggstr [99999] => ggsggstr ) 100k razy z array_slice = 2.085914850235 -> Array ( [99995] => ggsggstr [99996] => ggsggstr [99997] => ggsggstr [99998] => ggsggstr [99999] => ggsggstr ) Jak widać array_slice jest około 30% szybsze rozwiązanie i na pewno daje identyczny wynik w obu wypadkach, co widać po indeksach. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Dzieki za kod
![]() -------------------- |
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
To normalne zachowanie z limitem. Unset dostaje bowiem konkretny, jeden, klucz i go usuwa. Koszt resetowania, pobierania pierwszego klucza i usuwania jest w miarę wysoki, ale zawsze tak samo przebiega, stąd długość tablicy nie ma dla niego znaczenia. Zawsze wytnie pierwszy i koniec.
Z kolei im większy offset i długość wycinanego kawałka, tym dłużej array_slice przechodzi po kluczach kolejnych i czas mu rośnie. Całość jednak nieco inaczej by wyglądała, gdyby tablica wejściowa na wstępie była dowolnej długości i już na wstępie mogła mieć zarówno 1 jak i 40 elementów. O ile samo działanie nadal byłoby identycznie szybkie, o tyle doszła by Ci bowiem wstępna obróbka dla kodu z resetem jako "inicjalizacja", tak, by usunąć tyle elementów z przodu, by Ci zostało góra 4 elementy. Array_slice wystarczy leciutko jedynie zmodyfikować. Zamiast wstawia się bowiem co zawsze wycina maksymalnie 4 ostatnie elementy tablicy. Oczywiście nadal koszt się zwiększa z wycinanym kawałkiem, ale przestajesz się martwić czy dostarczona tablica jest pusta, ma 2 czy 5000 elementów. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Dodam jeszcze, że array_slice zwraca tablicę, którą wcześniej musi zainicjować i przekopiować do niej dane. Więc ogólna złożoność obliczeniowa wychodzi lepiej na korzyść rozwiązania z resetem, ale to już offtop
![]() -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 22.07.2025 - 09:39 |