Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Usuwanie duplikatów
Forum PHP.pl > Forum > Przedszkole
djdahu
Witam.

Mam plik log.txt zawierający logi urządzenia w postaci:

(...)
||24.06||201||14||1||
||24.06||201||15||1||
||25.06||201||16||2||
||27.06||201||17||2||
||27.06||201||18||4||
||27.06||201||19||3||
||28.06||201||20||0||
||29.06||201||21||0||
||29.06||201||22||0||
||29.06||201||23||1||
||30.06||201||00||0||
||30.06||201||01||0||
(...)

Pierwsza kolumna to wartości oznaczajace dni miesiąca, w których urządzenie wykonało daną akcję.
Zdaża się, że czasem urządzenie wykonuje akcję kilka razy w ciągu jednego dnia, a w innym dniu nie wykonuje jej wcale.
Muszę wyświetlić na stronie wszystkie dni, w których urządzenie zadziałało - bez względu na to czy raz, czy więcej razy.
Efekt, który chciałbym osiągnąć do powyższych przykładowych wartości to:

24.06
25.06
27.06
28.06
29.06
30.06

Oczywiście wiem o istnieniu funkcji pozwalających na pocięcie linii tak, by wyświetliło tylko potrzebną kolumnę danych i wiem o funkcji usuwającej duplikaty, ale walczę z tym od dłuższej "chwili" i nie mogę zlepić z tego w poprawnie działający kod.

Z góry dzięki za pomoc:)
tomxx
1. Pobierasz zawartość pliku i korzystając z explode, robisz z tego tablicę dwuwymiarową.
2. Korzystając z array_column (jeżeli masz PHP < 5.5, definiujesz tę funkcję tak jak np. proponuje tu użytkownik), pobierasz samą pierwszą kolumnę z dniami:
  1. $dni = array_column($logi, 0);
3. Usuwasz duplikaty, korzystając z array_unique.
kreatiff
Alternatywa to otworzenie pliku np. wykorzystując np. bibliotekę SPLFileObject, pobieranie w pętli każdej linii (przykład 1), wyciąganie z niej daty i dodawanie do tablicy jeśli nie istnieje, albo jak u przedmówcy dodawanie wszystkiego, a na końcu array_unique.
djdahu
Panowie, w teorii ja to wszystko wiem, tyle że mam problem ze złożeniem tego w jeden działający skrypt. Gdzieś robiłem błąd, możliwe ze gdzieś w skadni i mimo wielu prób skrypcik sie "wykrzaczał" na wszyskie, możiwe sposoby - trafił więc do kosza. Potrzebowałbym od Was pomocy w postaci gotowca, którego mógłbym przeanalizować - tak żebym wiedział gdzie robiłem błąd. To co ja napisałem niestety juz poleciało do smieci, więc nie mam jak wrzucić tutaj. Skrypt niby banalny, ale przysporzył mi troche problemów i przez niego utknąłem w miejscu..

Pozdr.
Wazniak96
Korzystając z SPLFileObject
  1. $days = array();
  2. $file = new SplFileObject("log.txt");
  3. while (!$file->eof()) {
  4. $current = $file->current();
  5. $log = explorer('||', $current);
  6. if(!in_array($log[0], $days);
  7. $days[] = $log[0];
  8. $file->next();
  9. }
tomxx
  1. <?php
  2.  
  3. # Otwieramy plik
  4. $fp = fopen("logi.txt", 'r');
  5.  
  6. # Sprawdzamy rozmiar pliku
  7. $rozmiar = filesize("logi.txt");
  8.  
  9. # Odczytujemy treść pliku
  10. $logi = fread( $fp, $rozmiar );
  11.  
  12. # Tworzymy tablicę z logami (jedna komórka - jedno kliknięcie)
  13. $logi = explode("\n", $logi)
  14.  
  15. # Każdy element tablicy dzielimy na komórki z poszczególnymi danymi
  16. foreach($logi as &$element)
  17. $element = explode("||", $element);
  18.  
  19. # Definiujemy funkcję array_column
  20. if(!function_exists("array_column"))
  21. {
  22.  
  23. function array_column($array,$column_name)
  24. {
  25.  
  26. return array_map(function($element) use($column_name){return $element[$column_name];}, $array);
  27.  
  28. }
  29.  
  30. }
  31.  
  32. # Pobieramy kolumnę z datą do jednej tablicy
  33. $daty = array_column($logi, 0);
  34.  
  35. # Usuwamy duplikaty
  36. $daty = array_unique($daty);
  37.  
  38. # Otrzymujemy gotową tablicę:
  39. print_r($daty);
  40.  
  41. ?>
Nie wiem, w czym tu jest problem...
djdahu
Dzieki tomxx, po kilku modyfikacjach pomogło i rozwiązało mój problem. Wiem też co robiłem źle wcześniej.

Cytat
Nie wiem, w czym tu jest problem...

Gdyby nie było tu problemu (dla mnie) to nie byłoby tego tematu.


Dzięki również dla pozostałych thumbsupsmileyanim.gif

Pyton_000
  1. $file = file_get_contents('plik.txt');
  2.  
  3. preg_match_all('/(\d{2}\.\d{2})/', $file, $match);
  4.  
  5. $unikalne = [];
  6. if(!empty($match[1])) {
  7. $unikalne = array_unique($match[1]);
  8. }
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.