Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: json zapis do pliku
Forum PHP.pl > Forum > PHP
dloogi
Cześć,

Bez bicia przyznam się, że php nie znam, rzecz do zrobienia jest na teraz i dlatego mocno proszę o pomoc w takiej sprawie.
Mam pliczek w formacie json.

Metodą prób i błędów udało mi się wypisać z niego dane jakie potrzebuje.

  1. <?php
  2. $input = file_get_contents("http://192.168.x.x/json");
  3. $json = $input;
  4. $output = json_decode($json,true);
  5. $my_t=getdate(date("U"));
  6.  
  7.  
  8. print("$my_t[mday]-$my_t[mon]-$my_t[year] $my_t[hours]:$my_t[minutes]:$my_t[seconds]");
  9. print(" ");
  10. print("Modul: ");
  11. print(" ");
  12. print $modul = $output['input'][0]['id'];
  13. print(" ");
  14. print(" - ");
  15. print(" ");
  16. print("Kierunek: ");
  17. print(" ");
  18. print $kierunek = $output['input'][0]['v'][0];
  19. print("°");
  20. print(" ");
  21. print("Sila:");
  22. print(" ");
  23. print $sila = $output['input'][0]['v'][1];
  24. print $jednostka = $output['input'][0]['u'][1];
  25. ?>


Potrzebuje wypisane dane zapisać/dopisywać do pliku txt - tak że po kolejnych uruchomieniach skrypty będzie tworzyła się baza odczytów z urządzenia.
Proszę o pomoc w temacie.
Quadina
W linii umieścić drukowanie całej tablicy i skopiować nam tutaj wynik ;-) Proszę rówineż napisać w którym miejscu tablicy mają zostać umieszczone nowe dane. Wtedy bez problemu pomożemy. Ewentualnie czy możemy otrzymać wygenerowany plik json?
  1. // w linii 6
  2. print_r($output);


W między czasie wysyłam propozycję takiego skryptu, mam nadzieje, że się przyda.

  1. // pobieramy dane tak jak poprzednio, usunalem tylko niepotrzebne wpisy
  2. $input = file_get_contents("http://192.168.x.x/json");
  3. $output = json_decode($input,true);
  4. $tab = $output['input'][0];
  5.  
  6. // Tworzymy sobie tablice danych ktore chcemy dopisac do pliki z logiem
  7. $save = array(
  8. // generjemy date w troche prostszy sposob
  9. date('Y-m-d H:i:s'),
  10. // nastepnie pobieramy dane tak jak wczasniej
  11. "Modul: ".$tab['id'],
  12. "Kierunek: ".$tab['v'][0],
  13. "Sila: ".$tab['v'][1],
  14. "Jednostka: ".$tab['u'][1],
  15. "",
  16. );
  17.  
  18. // otwieramy plik do zapisu i dodajemy dane z tablicy $save oddzielajac je <ENTEREM>
  19. $file = fopen('log.txt','a+');
  20. fwrite($file, implode($save,"\n"));
  21. fclose($file);
  22.  
  23. // na koncu drukujemy sobie na ekran to samo co zapisalismy do pliku
  24. echo implode($save, "\n");
dloogi
Witam,
  1. print_r($output) daje:


Array ( [vendor] => LAB-EL [type] => LB-489 [sn] => 96 [name] => LB-489 #96 [input] => Array ( [0] => Array ( [name] => Wiatromierz [mode] => s300 [id] => LB-746 #74 [v] => Array ( [0] => 304 [1] => 2 ) [u] => Array ( [0] => ° [1] => m/s ) ) [1] => Array ( [name] => Input 2 [mode] => s300 [id] => [v] => [u] => ) [2] => Array ( [name] => Input 3 [mode] => s300 [id] => [v] => [u] => ) [3] => Array ( [name] => Input 4 [mode] => s300 [id] => [v] => [u] => ) ) ) 3-12-2010 12:18:14 Modul: LB-746 #74 - Kierunek: 304° Sila: 2m/s


W json siedzi:
  1. {
  2. "vendor":"LAB-EL",
  3. "type":"LB-489",
  4. "sn":"96",
  5. "name":"LB-489 #96",
  6. "input":[
  7. {"name":"Input 1","mode":"s300","id":"LB-746 #74","v":[92,0.0],"u":["°","m/s"]},
  8. {"name":"Input 2","mode":"s300","id":null,"v":null,"u":null},
  9. {"name":"Input 3","mode":"s300","id":null,"v":null,"u":null},
  10. {"name":"Input 4","mode":"s300","id":null,"v":null,"u":null}
  11. ]
  12. }


Generalnie wystarczy, żeby po każdym uruchomieniu skryptu do pliku dopisywała się kolejna linka odczytu:
3-12-2010 12:18:14 Modul: LB-746 #74 - Kierunek: 304° Sila: 2m/s
3-12-2010 12:18:34 Modul: LB-746 #74 - Kierunek: 302° Sila: 1m/s
itd.
Quadina
Zatem wystarczy Ci coś takiego:

  1. // pobieramy dane tak jak poprzednio, usunalem tylko niepotrzebne wpisy
  2. $input = file_get_contents("http://192.168.x.x/json");
  3. $output = json_decode($input,true);
  4. $tab = $output['input'][0];
  5.  
  6. // Tworzymy sobie tablice danych ktore chcemy dopisac do pliki z logiem
  7. $save = array(
  8. date('Y-m-d H:i:s'),
  9. "Modul: ".$tab['id'],
  10. "Kierunek: ".$tab['v'][0].$tab['u'][0],
  11. "Sila: ".$tab['v'][1].$tab['u'][1],
  12. );
  13.  
  14. // otwieramy plik do zapisu i dodajemy dane z tablicy $save oddzielajac je <ENTEREM>
  15. $file = fopen('log.txt','a+');
  16. fwrite($file, implode($save," ")."\n");
  17. fclose($file);


Po uruchomieniu w kolejnych linijkach w pliku log.txt będą się dodawać wpisy według podanego przez Ciebie wzoru. Mam nadzieje, że pomogłem smile.gif
Fifi209
@Quadina

Przy ostatnim elemencie tablicy (przed wstawieniem nawiasu) nie dajemy przecinka.
Poza tym zostawiłeś gdzieś niedomknięty apostrof.
dloogi
Dziękuje Ci pięknie.smile.gif
Wkleiłem Twój kod:
  1. <?php
  2. $input = file_get_contents("http://192.168.66.220/json");
  3. $output = json_decode($input,true);
  4. $tab = $output['input'][0];
  5.  
  6. $save = array(
  7. date('Y-m-d H:i:s'),
  8. "Modul: ".$tab['id'],
  9. "Kierunek: ".$tab['v'][0].$tab['u'][0],
  10. "Sila: ".$tab['v'][1].$tab['u'][1],
  11. );
  12.  
  13. $file = fopen('log.txt','a+');
  14. fwrite($file, implode($save," ")."\n");
  15. fclose($file);
  16. ?>

Jedna rzecz nie zadziałała. Dopisuje kolejne odczyty w tej samej linii.
Spróbujesz coś jeszcze z tym zrobić?
Dzięki Ci tak czy inaczej wielkie!!
Quadina
@fifi209
Faktycznie był apostrof jeden nadmiarowy. Przecinek na końcu w PHP nie ma najmniejszego znaczenia - były już o tym ogromne dyskusje, których nie będę tutaj nadmieniał. Fakt pozostaje, że przecinek na końcu nie dodaje żadnego elementu jeżeli zaraz za nim jest nawias - a pozwala to na nie myślenie o tym czy to jest już ostatni element - bo bardzo często w takich sytuacjach kopiuje się linijki i je edytuje, wtedy ten przecinek zmuszałby programistę do dodatkowego myślenia.

@dloogi
  1. // w linii 14
  2. fwrite($file, implode($save," ")."\n\n");

Działa poprawnie ?
dloogi
Chociaż nie przepraszam.
Nie widzi enterów w notatniku w Wordpadzie już pokazuje w kolejnych liniach.smile.gif
Dziękuje!!
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.