Wyświetlenie powtarzających się ciągów w array.

0

Witam

Mam pytanie do mądrzejszych kolegów: Mam tablicę array jednowymiarową, która zawiera sobie n elementów, np:

array[0]='nazwa pliku - 0.ext';
array[1]='nazwa pliku - 1.ext';
array[2]='nazwa pliku - 2.ext';
array[3]='nazwa pliku - 3.ext';
...
array[n]='nazwa pliku - n.ext';

Jak w tych n elementach "wykryć" i wyświetlić tylko to co się powtarza, czyli tylko "nazwa pliku", ignorując to czym się różni, biorąc pod uwagę to, że nie można wcześniej ręcznie określić ciągu wg którego ma być porównanie.

Na pewno rozwiązanie jest banalnie proste, ale właśnie z tymi banałami człowiek najbardziej się męczy.

Pozdrawiam wszystkich i życzę Wesołych, Pogodnych Świąt Bożego Narodzenia :)

Toshiaczek.

0

pytanie - czy interesują cię tylko frontowe znaki, czy te potem też?

0

ta druga opcja. Nazwy plików mogą być nieidentyczne, bo zawsze istnieje szansa, że ktoś wstawił coś na początku, np. [xyz] lub podobnego...
W zasadzie chodzi mi o wypisanie tylko tych kawałków ciągów, które się wszędzie/najczęściej powtarzają. '[xyz]nazwa_pliku', 'nazwa_pliku' i 'nazwa pliku' zawierają 2 ciągi, które się powtarzają tu, tu i tu, jak to wykryć dla większej ilości takich wpisów????

0

Wydaje mi się, że jest to trochę skomplikowany problem.

Skoro nie wiesz jaki łańcuch znaków to trzeba porównać nazwy wszystkich plików i policzyć który łańcuch znaków się powtarza najczęściej.

Kolejny problem to jak długi ma być ten łańcuch znaków do porównania. Łańcuch dwuliterowy też jest łańcuchem.

Wyobraźmy sobie przykład (wg twojego opisu) jeśli coś nie tak to popraw mnie:

array[0]='plik1 - 0.ext';
array[1]='file2 - 1.ext';
array[2]='zdjecie - 2.ext';
array[3]='picture - 3.ext';
...
array[n]='aplikacja - n.ext';

To w tym momencie nie ma żadnego ciągu wspólnego. I co teraz??

Może jakbyś napisał coś więcej o zastosowaniu Tego!

0

Potrzebuję to do dodawania odcinków seriali do bazy filmów.
Powtórzenia będą na pewno, ponieważ nie spotkałem się z serialem jednoodcinkowym ;)
Jeśli będzie tylko 1 plik, to wtedy wiadomo, że nie ma co porównywać.
Co do przykładu, to bardziej skłaniałbym się ku temu:
array[0]='House M.D. - 01.avi';
array[1]='House M.D. - 02.avi';
array[2]='House M.D. - 03.avi';
array[3]='House M.D. - 04.avi';
array[4]='C.S.I. - 01.avi';
array[5]='C.S.I. - 02.avi';
array[6]='C.S.I. - 03.avi';
array[7]='BnB - 00001.avi';
array[8]='BnB - 00002.avi';
...
array[n]='BnB - 5114.avi';
array[n+1]='BnB - 5115.avi';

itp.
Tylko, że niektórzy nazywają swoje pliki rózne, ze spacjami, kropkami lub podkreśleniami między wyrazami... Dodają sumę CRC32 w nawiasach klamrowych itp.

Pozdrawiam.

0

No ok, ale jak to sobie wyobrażasz ?

Nawet gdybyś miał to napisać słowami (algorytm) skoro pisałeś wcześniej, że ktoś może dodać coś na początku, na końcu, albo nawet w środku ciągu, a nawet nie ma odnośnika wg, którego porównywać, to jak byś to chciał zrobić?

ok. praktycznie:

array[0]='01.House MD.avi';
array[1]='02_House M.D.avi';
array[2]='03_House_MD.avi';
array[3]='House M.D. - 04.avi';
array[4]='C.S.I.1.avi';
array[5]='CSI.02.avi';
array[6]='C.S.I. odc 03.avi';

No i teraz zaczynamy porównywać.

Bierzemy array[0] i porównujemy z array[1]. Jak to porównać? Litera po literze? Wszystkie te pliki mają bardzo różne nazwy.

Ciekawi mnie ciągle dlaczego chcesz wyciągać te dane? Tak ciężko je wpisać???

0

@Freebird: "Wszystkie te pliki mają bardzo różne nazwy"
Nie wszystkie, np. w [0]...[3] występuje identyczny fragment ('House'). W [4] i [6]również ('C.S.I.').
Jak wyłapać te powtarzające się kawałki? Mogę trochę uszczuplić wymagania co do formatowania napisów... Ręcznie zmieniając wszystkie _ czy dziwnie postawione kropki na spacje...

Może sobie zbyt ambitne zadanie zadałem?

@dzek69 "Raczej koleś mógłby chcieć zedrzeć z jakiejś strony napisy wg id, np. download.php?id=1 ..... download.php?id=100000, a potem wg nazw plików dopasować co to za napisy"
Nie, nie i jeszcze raz nie. Niby w jakim celu i z jakiego powodu? Ten pomysł odpada. Nie bawię się w tego typu rzeczy. Algorytm potrzebuję do uporządkowania mojej prywatnej kolekcji a nie do rypania po chamsku czyjejś strony.

0

Celem znormalizowania stringów raczej po prostu usuwaj kropki/podkreślenia, niż je zamieniaj na spacje, bo sobie zrobisz np. CSI i C S I. Choć z drugiej strony niektórzy pliki nazywają The.Chronicles.Of.Riddick.2010 i znowu problem.

Na pewno jest uwaga - stworzenie algorytmu który dopasuje do siebie jakoś CSI - 01x01.avi oraz C.S.I. - Pilot - 01x01 [Axxo Uber DVD RIP].avi jeszcze może być możliwe. Ale jeżeli w jednej tablicy umieścisz zarówno CSI - 01x01.avi oraz House M.D. - 04.avi to jedyne co będzie wspólne to .avi.

Raczej ambitne pytanie wymagające dogłębnej analizy znaków, ja sam nie wiem jak się za to skutecznie zabrać. Bym próbował jakiejś normalizacji inputu, a potem coś w rodzaju: http://en.wikipedia.org/wiki/Longest_common_substring_problem ale nie wiem z jakim rezultatem. Wciąż jednak to nie ruszy z jedną tablicą z wszystkimi nazwami.

0

Pomysł na skrypt okazał się zbyt trudny do realizacji. Porzucam ten pomysł.
Dziękuję wszystkim za pomoc i poświęcony czas.
Jeszcze raz życzę wszystkim Wesołych Świąt!

Toshiaczek.

0

może coś w ten deseń http://bazawiedzy.cichaprzystan.org/74/rekursywne-laczenie-tablic-bez-powtorzen/ albo własne nazwy przy zapisie ;)

0

A jak to działa? Tzn jak tego użyć, bo jakoś nie umiem dojść, co ta funkcja na dokładnie robi...

0

@toshiaczek: To nie ma nic wspólnego z tematem.
@comstudio postuje coś losowego. btw: funkcja bez sensu, array_unique(array_merge_recursive($a2, $a1)); zrobi to samo, ale niektórzy lubią wynajdywać koło od nowa (hint: informacje zawarte w komentarzach na php.net nie są weryfikowane i oceniane)

0

@dzek69 masz rację, jak czytałem co autor miał na myśli, to źle go zrozumiałem teraz widzę, że nie chodziło o to żeby nazwy się nie powtarzały..

0

Możesz zasosować algorytm sortowania bąbelkowego z przeróbkami


for ($i=0;count($tablica);$i++) {
    for ($j=0;count($tablica);$j++) {

       if ($tablica[$i] == $tablica[$j]) {
       $tablica2[$i] = $tablica[$i];
       }

    }



}
 
0

@tomi0001 też wpadłem na pomysł użycia w/w algorytmu, jednak szybko zniechęciłem się do niego (nie wiem czy słusznie).

Tak czy siak - moje stringi w array, a dokładniej nazwy plików obrabiam ręcznie (Total Commander+narzędzie wielokrotnej zmiany...), wg jakiegoś własnego klucza, więc automat prawdę mówiąc - nieprzydatny. Zresztą, plików nie ma aż tak wiele naraz do obrobienia. Łącznie jakieś 10-12k, więc szybko i przyjemnie pójdzie...

1 użytkowników online, w tym zalogowanych: 0, gości: 1