[PHP] Zliczanie najczęściej występujących ciągów

Witam.

Mam plik w którym znajdują sie adresy IP jeden pod drugim. Chcę zrobić listę 10 adresów powtarzających się najczęściej. Jak tego dokonać?

Lista ma wyglądać mniej więcej w ten sposób

Znasz się na PHP, na tyle aby Ci wystarczył sam algorytm tej operacji?

PHP znam na tyle żeby sobie z tym poradzić jednak nie wiem jak sie za to zabrać.

Można na kilka sposobów np. tak.

Dwie tablice, $tab1 i $tab2.

Do $tab1 ładujesz wszystkie adresy ip.

Potem:

-pobierasz pierszy element tablicy $tab1

-sprzawdzasz czy w $tab2 jest odpowiadający mu element

-jeżeli jest - zwiększasz licznik dla odp. klucza $tab2, jeżeli nie - tworzysz w $tab2 nowy z wartością 1

-przechodzisz do kolejnego elementu $tab1…

W $tab2 możesz zapisywać w ten sposób $tab2[‘192.168.1.7’][0]=6;

Można też najpierw posortować $tab1, a porównywać każdy element z kolejnym i sumować gdy identyczne lub zapisywać wynik gdy różne…

Można też do zliczenia wystąpień danego adresu skorzystać z preg_match_all

tak z ciekawości, po co drugi wymiar tablicy? :clever:

nie mniej jednak, ten algorytm jest poprawny, pytanie tylko czy wykona się szybciej i zużywając mniej zasobów niż gotowa funkcja array_count_values

Fakt, drugi wymiar jest tu całkowicie zbędny - wynik pośpiechu.

Skupiłem się na algorytmie, dlatego nie wspominałem o array-count-values.

Co do szybkości i wydajności… Nie robiłem testów na dużej ilości danych, ale przypuszczam że array-count-values jest szybsze -jak z resztą większość wbudowanych funkcji. Jak zapewne wiesz, własne rozwiązanie nieraz daje większe możliwości dostosowania do własnych potrzeb.

Tak czy owak, pominęliśmy całkowicie, że właśnie przy sporej ilości danych operowanie na plikach to masohizm.

Od tego są bazy.

Dziękuję za pomoc.

Funkcja array_count_values spełnia dobrze swoje zadanie.

Danych nie jest wiele, dlatego nie opłaca mi się zaprzęgać do tego bazy.