Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Duplikaty linków
Forum PHP.pl > Forum > Przedszkole
Qbexus
To mój pierwszy post, więc witam wszystkich.
Gromadzę linki do katalogu tematycznego i utknąłem na narzędziu do zbierania sortowania i weryfikacji linków.
Zrobiłem kasowanie duplikatów w txt na array_unique ale niestety to nie wystarcza. Nie wiem jak poradzić sobie z linkami typu http://domena.com i http://www.domena.com jeden z nich powinien zostać usunięty. A także nie wiem jak zrobić, aby skrypt porównywał linki z jednego pliku txt z linkami z drugiego np. badlinks.txt i z 1 usuwał te, które są w 2. Nie wiem czy jasno to opisałem, ale jestem początkujący, więc proszę o wyrozumiałość
Ludvik
Problem w tym, że to nie są dwie takie same domeny. Jeżeli chcesz jednak się tego pozbyć, to usuwaj www. przed dodaniem do bazy.

Usuwanie jest dość proste, jedna operacja na dwóch zbiorach. Odczytujesz obie listy i obliczasz ich różnicę.
A - lista domen
B - lista złych domen

A \ B = lista "dobrych" domen.

array_diff" title="Zobacz w manualu php" target="_manual
Qbexus
Dzięki za array_diff o to chodziło.A z tym www wolałbym nie usuwać, dlatego że jeżeli link wystąpi w obu formach to jest prawie pewne, że kryje się pod nimi ten sam serwis. Jednak nieraz po usunięciu z linka WWW przestaje działać.

Niestety spłodziłem coś takiego i nie działa.
  1. <?php
  2. $plik = file('./pelnalistaurli.txt');
  3. $plik2 = file('./badurl.txt');
  4. $wynik = array_diff ($plik, $plik2);
  5. $numerlini = count($plik);
  6. $numerlini2 = count($plik2);
  7. $numerlini3 = count($wynik);
  8. echo $numerlini.'<br>';
  9. echo $numerlini2.'<br>';
  10. echo $numerlini3.'<br>';
  11. var_dump ($wynik);
  12. ?>

W pliku pelnalistaurli jest
janek
ania
marek
zenek

a w pliku badurl
marek
ania

a wynik = pelna listaurli nic nie kasuje.
Ludvik
Pokaż zrzuty zmiennych $plik i $plik2, wtedy może coś pomogę. Spróbuj wyniki przepuścić przez funkcję trim" title="Zobacz w manualu php" target="_manual albo podstawić same wartości (array_values" title="Zobacz w manualu php" target="_manual).
Qbexus
Kod teraz jaest taki
  1. <?
  2. $plik = file('./pelnalistaurli.txt');
  3. $plik2 = file('./badurl.txt');
  4. $wynik = array_diff ($plik, $plik2);
  5. $numerlini = count($plik);
  6. $numerlini2 = count($plik2);
  7. $numerlini3 = count($wynik);
  8. echo $numerlini.'<br>';
  9. var_dump ($plik);
  10. echo '<br>';
  11. echo $numerlini2.'<br>';
  12. var_dump ($plik2);
  13. echo '<br>';
  14. echo $numerlini3.'<br>';
  15. var_dump ($wynik);
  16. $fp = fopen("urle_sort.txt", "w");
  17. fputs($fp, $wynik);
  18. fclose($fp);
  19. ?>

a wynik taki
Kod
4
array(4) { [0]=> string(6) "janek " [1]=> string(5) "ania " [2]=> string(6) "marek " [3]=> string(5) "zenek" }
2
array(2) { [0]=> string(7) "marek " [1]=> string(6) "ania " }
4
array(4) { [0]=> string(6) "janek " [1]=> string(5) "ania " [2]=> string(6) "marek " [3]=> string(5) "zenek" }
Ludvik
Przypatrz się długościom stringów... Są różne, więc elementy różnią się. Spróbuj:
  1. <?php
  2. $plik = array_filter($plik, 'trim');
  3. ?>

I to samo dla drugiej tablicy. Jak nie zadziała to też daj zrzuty...
Qbexus
Niestety nadal kiszka nie mam pojęcia skąd się biorą różnicę w stringach

Kod
5
array(5) { [0]=> string(6) "tadek " [1]=> string(5) "ania " [2]=> string(6) "marek " [3]=> string(6) "janek " [4]=> string(6) "wiktor" }
4
array(4) { [0]=> string(6) "ania " [1]=> string(7) "janek " [2]=> string(9) "zdzisiu " [3]=> string(5) "tadek" }
5
array(5) { [0]=> string(6) "tadek " [1]=> string(5) "ania " [2]=> string(6) "marek " [3]=> string(6) "janek " [4]=> string(6) "wiktor" }


Wszystkie imiona wpisywałem ręcznie dając enter na końcu lini.
Ludvik
Z tego co napisałeś, to nie widzę, żebyś zrobił, to co mówiłem.
  1. <?
  2. $plik = file('./pelnalistaurli.txt');
  3. $plik = array_filter($plik, 'trim');
  4. $plik2 = file('./badurl.txt');
  5. $plik2 = array_filter($plik2, 'trim');
  6. $wynik = array_diff ($plik, $plik2);
  7. $numerlini = count($plik);
  8. $numerlini2 = count($plik2);
  9. $numerlini3 = count($wynik);
  10. echo $numerlini.'<br>';
  11. var_dump ($plik);
  12. echo '<br>';
  13. echo $numerlini2.'<br>';
  14. var_dump ($plik2);
  15. echo '<br>';
  16. echo $numerlini3.'<br>';
  17. var_dump ($wynik);
  18. $fp = fopen("urle_sort.txt", "w");
  19. fputs($fp, $wynik);
  20. fclose($fp);
  21. ?>
Qbexus
Ja mam tak
  1. <?
  2. $plik = file('./pelnalistaurli.txt');
  3. $plik2 = file('./badurl.txt');
  4. $plik = array_filter($plik, 'trim');
  5. $plik2 = array_filter($plik2, 'trim');
  6. $wynik = array_diff ($plik, $plik2);
  7. $numerlini = count($plik);
  8. $numerlini2 = count($plik2);
  9. $numerlini3 = count($wynik);
  10. echo $numerlini.'<br>';
  11. var_dump ($plik);
  12. echo '<br>';
  13. echo $numerlini2.'<br>';
  14. var_dump ($plik2);
  15. echo '<br>';
  16. echo $numerlini3.'<br>';
  17. var_dump ($wynik);
  18. $fp = fopen("urle_sort.txt", "w");
  19. fputs($fp, $wynik);
  20. fclose($fp);
  21. ?>

Ale sprawdzę i twój skrypt



Niestety jak się można domyśleć efekt jest dokładnie ten sam tak jak by trim nic nie dawał i skąd te różnice nie rozumiem tego.
Ludvik
Skasowałem... Pomyliłem funkcję blink.gif Zamiast array_filter użyj array_map.
  1. <?php
  2. $plik = array_map('trim', $plik);
  3. ?>
Qbexus
Wielkie dzięki jest super. A swoją drogą ciekawe skąd się biorą te dziwne nie istniejące znaki.


Niestety mam następnego zonka chyba teraz za dobrze wyczyścilo wszelkie znaki bo jak chce to zapisać to zapisuje mi wszystko w jednej lini zamiast każdy link osobno.
  1. <?php
  2. for( $xbleble = 0; $xbleble <= $numerlini; $xbleble++ )
  3. {
  4.  
  5. sort ($wynik);
  6. reset ($wynik);
  7. $zapisz.= $wynik[$xbleble];
  8. }
  9. $fp = fopen("urle_sort.txt", "w");
  10. fputs($fp, $zapisz);
  11. fclose($fp);
  12. ?>

W innym skrypcie z array_unique to działa bez problemu. blink.gif
Ludvik
Posortuj tablicę raz przed pętlą, a nie przy każdym przebiegu. Ogólnie to najlepiej zrobić to tak:
  1. <?php
  2. $zapisz = implode("n", $wynik);
  3. ?>

Gdzie wynik jest tablicą, którą chcesz zrzucić do pliku. Pamiętaj, że przy otwieraniu funkcją file" title="Zobacz w manualu php" target="_manual wyrzucane są wszystkie znaki nowej linii i przed zapisem musisz je przywrócić. Problemy z pustymi znakami to raczej wina edytora, którego używasz. Windows, Linux i Mac OS mają różne metody oznaczania końca wiersza i to są najprawdopodobniej te zbędne znaki.
Qbexus
Patrz kurcze jakie to proste a ja zawsze ćwiczyłem pętle i tp. dzięki.
Znacie może jakąś polską stronę gdzie łopatologicznie są takie fajne kruczki opisane?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.