Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Usuwanie powtórzeń tekstu
Forum PHP.pl > Forum > PHP
sebekzosw
Witam, mam skrypt do zarządzania MENU oparty o pliki TXT. Mój plik wygląda tak:

Kod
1||Menu Główne||menu_glowne||||1||file||1||
2||Logowanie||panel_uzytkownika||||4||file||1||


Ale przy zarządzaniu tego menu występuje błąd - robi się coś takiego:
Kod
1||Menu Główne||menu_glowne||||1||file||1||
1||Menu Główne||menu_glowne||||1||file||1||
2||Logowanie||panel_uzytkownika||||4||file||1||


Chciałbym, aby to co się powtórzyło - 1||Menu Główne||menu_glowne||||1||file||1|| - zostało usunięte przez skrypt. I każde inne powtórzenie... Z góry dzięki za pomoc ;-)
kaem
Przydał by się jakiś kod, gdzie wykonujesz operacje na tym pliku, to może wtedy zlokalizujemy błąd.
sebekzosw
  1. <?php
  2. if ($krok == "prawo") {
  3.  if(isset($_GET["panel_id"])) {
  4. $filename = GLOWNY."baza_".$data_instalacji."/menu.txt";
  5.  
  6. $nr_y = $_GET["panel_id"];
  7. $dane = file($filename);
  8. $wyciagnij = explode("||", $dane[$nr_y-1]);
  9.  
  10. $nowy = "".$wyciagnij[0]."||".$wyciagnij[1]."||".$wyciagnij[2]."||".$wyciagnij[3]."||4||".$wyciagnij[5]."||".$wyciagnij[6]."";
  11.  
  12. $plik = file($filename);
  13. $plik[$nr_y-1] = $nowy."r\n".$plik[$nr_y-1];
  14. $plik = implode("",$plik);
  15.  
  16. $fp = fopen($filename , "w");flock($fp,2);
  17. fputs( $fp , $plik);
  18. flock($fp,3);fclose($fp);
  19.  
  20. $linia_do_przeniesienia = $_GET["panel_id"];
  21. $dane = file($filename);
  22. unset($dane[$linia_do_przeniesienia]);
  23.  
  24. $f = fopen($filename, "w");
  25. foreach($dane as $linia){
  26.  fputs($f, $linia);
  27. }
  28. fclose($f);
  29. header("Location: ".ACC_SELF.$link_autoryzacyjny."");
  30.  }
  31. }
  32. ?>


To ma za zadanie przesuwać menu w prawo, link wygląda tak:
panele.php?krok=prawo&amp;panel_id=1

tylko, że to wygląda tak: raz robi się powtórzenie, raz nie ;-)
kaem
Jestem początkującym programistą, ale dla mnie trochę ten kod zakręcony rolleyes.gif Nie wiem za bardzo jak to ma działać, ale np w tym miejscu:
  1. <?php
  2. $plik = file($filename);
  3. $plik[$nr_y-1] = $nowy.&#092;"r\n\".$plik[$nr_y-1];
  4. ?>

zmienne $nowy i $plik[$nr_y-1] chyba mają taką samą zawartość, z tym że $nowy nie ma na końcu '||'. Czyli zerowy element tablicy $plik ma tak jakby dwa takie same wiersze oddzielone powrotem karetki i nową linią. Tak ma być?
A tutaj:
  1. <?php
  2. $wyciagnij = explode("||", $dane[$nr_y-1]);
  3.  
  4. $nowy = "".$wyciagnij[0]."||".$wyciagnij[1]."||".$wyciagnij[2]."||".$wyciagnij[3]."||4||".$wyciagnij[5]."||".$wyciagnij[6].""
  5. ?>

nie rozumiem po co rozbijasz wiersz za pomocą explode jak potem łączysz to z powrotem?
Widze, że na końcu w $nowy nie ma tylko tych dwóch kreseczek '||', wiec wystarczyło użyć funkcji
  1. <?php
  2. substr($dane[$nr_y-1], 0 , strlen($dane[$nr_y-1])-2)
  3. ?>

Nie wiem, czy dobrze napisałem ale chodzi o to, że funkcja zwraca stringa "wyciętego" z $dane[nr_y-1] od znaku zerowego do drugiego od końca.
sebekzosw
  1. <?php
  2. $wyciagnij = explode("||", $dane[$nr_y-1]);
  3.  
  4. $nowy = "".$wyciagnij[0]."||".$wyciagnij[1]."||".$wyciagnij[2]."||".$wyciagnij[3]."||4||".$wyciagnij[5]."||".$wyciagnij[6].""
  5. ?>


Ty wygląda tak:
1||Menu Główne||menu_glowne||||1||file||1||

To oznacza, że menu ma być po lewej stronie, a tamto zmienia każdą zawartość oprócz $wyciagnij[5]

i po zmianie powstaje
1||Menu Główne||menu_glowne||||4||file||1||
kaem
Nie wiem jak logicznie obmyśliłeś jak ta strona ma działać, do czego służą te wartości w pliku, więc w tym ci niestety nie pomogę.
BTW. Po wykonaniu dwukrotnie tego twojego skryptu na pliku
  1. 1||Menu Główne||menu_glowne||||1||file||1||
  2. 2||Logowanie||panel_uzytkownika||||4||file||1||

wyszło mi coś takiego:
  1. 1||Menu Główne||menu_glowne||||4||file||1
  2. 1||Menu Główne||menu_glowne||||4||file||1
  3. 2||Logowanie||panel_uzytkownika||||4||file||1||

Jak chcesz usunąć powtarzające się wiersze, to wczytaj plik za pomocą "file()" do jakiejś tablicy tak jak robiłeś i w pętli for przejdź przez całą tą tablice. W pętli porównuj dwa kolejne wiersze, jeśli będą różne to zapisuj je do pliku, jeśli takie same to nic nie rób i dajesz następny obrót pętli.
sebekzosw
Cytat
Jak chcesz usunąć powtarzające się wiersze, to wczytaj plik za pomocą "file()" do jakiejś tablicy tak jak robiłeś i w pętli for przejdź przez całą tą tablice. W pętli porównuj dwa kolejne wiersze, jeśli będą różne to zapisuj je do pliku, jeśli takie same to nic nie rób i dajesz następny obrót pętli.


Jak byś mógł to zamienić na kod... ;D
kaem
Tak na szybko teraz mogę napisać bez uruchamiania, jak bede miał trochę więcej czasu to edytuje i postaram się poprawić co będzie źle. Mniej więcej ma to wyglądać jakos tak:
  1. <?php
  2. $dane = file($filename);
  3. $wsk = fopen($filename , &#092;"w\");
  4.  
  5. for($i=0; $i<=count($dane)-2; $i++)
  6. {
  7.  if($dane[$i] !== $dane[$i+1])
  8. fwrite($wsk, $dane[$i], strlen($dane[$i]));
  9. }
  10. fwrite($wsk, $dane[count($dane)-1], strlen($dane[count($dane)-1]));
  11. ?>

Ale coś mi się wydaje, że może nie usuwać ostatnich dwóch takich samych wierszy, bo w ostatnim jest jeszcze znak końca pliku i te dwa wiersze może uznać za różne. Ale nie wiem czy tak rzeczywiście jest dry.gif . Potem zobacze, a może ktoś inny pomoże w międzyczasie rolleyes.gif


Hmmm to usuwanie powtarzających wierszy powinno działać, ale wcześniej w tym swoim skrypcie powinieneś przed fclose($f) dodać do pliku jeszcze znak końca lini fputs($f, "\n") albo fputs($f, "\r\n"). Ja to łopatologicznie robiłem tak, że otwierałem plik w notatniku, dawałem kursor na koniec ostatniego wiersza i wciskałem enter. Wtedy ładnie usuwał. Bo inaczej nie wiem jak rozwiązać ten problem końca pliku tiredsmiley.gif
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.