Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Usuwanie duplikatów
djdahu
post 1.07.2015, 01:23:31
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 1.07.2015

Ostrzeżenie: (0%)
-----


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:)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
tomxx
post 1.07.2015, 03:45:31
Post #2





Grupa: Zarejestrowani
Postów: 172
Pomógł: 27
Dołączył: 5.10.2013

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
kreatiff
post 1.07.2015, 09:34:23
Post #3





Grupa: Zarejestrowani
Postów: 324
Pomógł: 105
Dołączył: 7.08.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
djdahu
post 2.07.2015, 11:40:39
Post #4





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 1.07.2015

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Wazniak96
post 2.07.2015, 11:55:32
Post #5





Grupa: Zarejestrowani
Postów: 550
Pomógł: 75
Dołączył: 5.06.2012
Skąd: Lębork

Ostrzeżenie: (0%)
-----


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. }
Go to the top of the page
+Quote Post
tomxx
post 2.07.2015, 14:05:40
Post #6





Grupa: Zarejestrowani
Postów: 172
Pomógł: 27
Dołączył: 5.10.2013

Ostrzeżenie: (0%)
-----


  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...
Go to the top of the page
+Quote Post
djdahu
post 4.07.2015, 02:46:19
Post #7





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 1.07.2015

Ostrzeżenie: (0%)
-----


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

Go to the top of the page
+Quote Post
Pyton_000
post 4.07.2015, 08:30:16
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


  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. }
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 16:20