Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][PHP]Dane z json do tabelki
Forum PHP.pl > Forum > Przedszkole
brzanek
Witam mam nietypowy problem mam stronę z danymi w formacie json, która wygląda tak:
{"time":1644134255387686100,"lat":56.222444,"lon":8.22895,"alt":0,"pol":0,"mds":9339,"mcg":139,"status":2,"region":9} {"time":1644134255387686100,"lat":56.222444,"lon":8.22895,"alt":0,"pol":0,"mds":9339,"mcg":139,"status":1,"region":8}
{"time":1644133487442192400,"lat":57.404517,"lon":-5.173029,"alt":0,"pol":0,"mds":7454,"mcg":221,"status":2,"region":9}
{"time":1644133487442192400,"lat":57.404517,"lon":-5.173029,"alt":0,"pol":0,"mds":7454,"mcg":221,"status":1,"region":8}

Jak widać kod zaczyna się od { i tak też się kończy}
Jak mogę to wyświetlić w przyjemny dla oka sposób? np. w formie tabelki.

Próbowałem wyciągnąć pojedyncze rekordy na zasadzie
  1. $json = 'adres_strony';
  2. $json = file_get_contents($json);
  3. $response = json_decode($json, true);
  4. if ($response != null) {
  5. $latitude = $response['lat'];
  6. }
  7. echo $latitude;

Ale nic mi to nie dawało.
Gdzie popełniam błąd?
trueblue
To nie jest poprawny format JSON, do sprawdzenia np. tu: https://jsonformatter.curiousconcept.com/
Sprawdź jaki jest wynik walidacji na tej stronie, a to naprowadzi Cię na rozwiązanie.
brzanek
No właśnie tak mi się wydawało że to jakiś błędny format json. Wyświetla się błąd przy nawiasie {
Ale ja nie mogę zmienić tych danych bo takie udostępnia strona.
Więc jak to poprawnie wyświetlić?
Jest taka możliwość?
trueblue
Na podanej stronie przy walidacji tych danych jest informacja tekstowa o błędzie.
Możliwe są dwa rozwiązania, albo na podstawie tejże informacji, ale po przejrzeniu informacji z tej strony: https://developer.mozilla.org/en-US/docs/Le...pt/Objects/JSON
brzanek
Podałeś jedno rozwiązanie a drugie?
Te pierwsze rozwiązanie jest dla mnie nie zrozumiałe.
trueblue
Literówka.
"albo po przejrzeniu informacji z tej strony: https://developer.mozilla.org/en-US/docs/Le...ects/JSON".
brzanek
Ani pierwsze ani drugie rozwiązanie nic mi nie mówi.
Rozumiem, że muszę pozbyć się tych nawiasu {} ale jak to zrobić?
trueblue
Źle rozumiesz.

Komunikat jasno wskazuje, że występuje kilka elementów JSON. Tak więc możesz parsować każdą linię z osobna.
Albo według drugiego linku struktura tablicy JSON jest taka:
[{...},
{...},
{...}]
co oznacza, że musiałbyś dodać na początku ciągu [, na końcu ciągu ], a po każdym } oprócz ostatniego, dodać przecinek. W ten sposób możesz parsować całość.
brzanek
A jak to dodać te nawiasy i ten przecinek w php?
trueblue
Chyba żartujesz. Nie wiesz jak się skleja dwa stringi w PHP?
brzanek
Ja już się poddaję
robię to tak
  1. $json = 'adres_strony';
  2. $json = file_get_contents($json);
  3. $response = json_decode($json, true);
  4. if ($response) {
  5.  
  6. $i=0;
  7. foreach ($hourlycond1 as $cond1) {
  8. if($i++) break;
  9. $latitude = $cond1['lat'];
  10. }
  11. }
  12. echo $latitude;

Chcę wyciągnąć narazie samo lat i nic się nie dzieje - dlaczego?
viking
No przecież masz dalej niepoprawny json, tak?
brzanek
Tak pliku json nie poprawiałem bo nie wiem jak.
Zauważyłem, że plik z tymi danymi

{"time":1644219018033653000,"lat":49.995587,"lon":-4.70365,"alt":0,"pol":0,"mds":11133,"mcg":253,"status":0,"region":1} {"time":1644218648920853800,"lat":47.824174,"lon":16.410704,"alt":0,"pol":0,"mds":5390,"mcg":249,"status":0,"region":1} {"time":1644218648920841500,"lat":47.775894,"lon":16.422004,"alt":0,"pol":0,"mds":12354,"mcg":97,"status":2,"region":9} {"time":1644218648920840400,"lat":47.773601,"lon":16.40819,"alt":0,"pol":0,"mds":4716,"mcg":171,"status":1,"region":8}

jest z rozszerzeniem .php a nie .json - może tu jest problem?
viking
A skąd te dane bierzesz? Bo może problemem jest nie to że API zwraca złe dane, ale że Ty je źle zapisujesz.
brzanek
Są to dane o wyładowaniach atmosferycznych.
Są przedstawiane w takiej formie jak na tej stronie https://pogoda-zachodniopomorskie.pl/wyladowania/danephp.php
Jest to plik php nie json.
trueblue
Potrafisz przekształcić jedną linię z tego co pokazałeś na tablicę w PHP?
brzanek
No niby tak jak w adresie jest ?number=1
  1. $json = 'https://'.$loginname.':'.$password.'@data.blitzortung.org/Data/Protected/last_strikes.php?number=1&west=-10&east=40&north=70&south=20&sig=0';
  2. $json = file_get_contents($json);
  3. $response = json_decode($json, true);
  4. if ($response != null) {
  5. $latitude = $response['lat'];
  6. }
  7. echo $latitude;

Ale jak w adresie jest ostatnie np. 10 ?number=10
To już nie wychodzi.
trueblue
Moje pytanie brzmi: Czy potrafisz poniższą linię (jedną linię z podanego wyniku), przekształcić na tablicę w PHP?

Czyli dane wejściowe:
{"time":1644219018033653000,"lat":49.995587,"lon":-4.70365,"alt":0,"pol":0,"mds":11133,"mcg":253,"status":0,"region":1}
a wyjściowo ma być tablica w PHP.

Potrafisz?
viking
Chwila szukania w dokumentacji: https://www.blitzortung.org/en/compendium.php
Each line of the data files contains one JSON codes variable.

Czyli masz sobie to zaczytać np file i po kolei każą linię traktować jako pojedynczy json.
trueblue
To już Autor miał tłumaczone w poście #8.
brzanek
Już się sam zakręciłem
  1. $json = 'https://'.$loginname.':'.$password.'@data.blitzortung.org/Data/Protected/last_strikes.php?number=1&west=-10&east=40&north=70&south=20&sig=0';
  2. $json = file_get_contents($json);
  3. $response = json_decode($json, true);
  4. if ($response != null) {
  5. $latitude = $response['lat'];
  6. $lon = $response['lon'];
  7. }
  8. echo $latitude. $lon. "<br />\n";

A tak robię to na zasadzie pliku csv
  1. $url = fopen ('https://'.$loginname.':'.$password.'@data.blitzortung.org/Data/Protected/last_strikes.php?number=10&west=-10&east=40&north=70&south=20&sig=0','r');
  2. while (($data = fgetcsv($url, 1000, ",")) !== FALSE){
  3. echo $data[0] . $data[1] . $data[2] . $data[3] . $data[4] . $data[5] . $data[6] . $data[7] . $data[8] . "<br />\n";
  4. }

W pierwszym zapytaniu pobieram tylko ?number=1 a w drugim ?number=10 ale i tak to nie jest to co chciałem uzyskać.
Teraz na stronie wygląda to tak https://pogoda-zachodniopomorskie.pl/wyladowania/dane.php
nospor
Jakie CSV?? Nikt ci nie kazal pobierac tego jako CSV... Wyraznie napisali: FILE()
brzanek
Dałem
  1. $section = file('https://'.$loginname.':'.$password.'@data.blitzortung.org/Data/Protected/last_strikes.php?number=10&west=-10&east=40&north=70&south=20&sig=0');
  2. echo $section. "<br />\n";

Wyszła pusta tablica Array
nospor
Nie echo a printR .....
print_r($section);
czemu musimi ci takie podstawy pisac :/
brzanek
No ok mam
  1. $section = file('https://'.$loginname.':'.$password.'@data.blitzortung.org/Data/Protected/last_strikes.php?number=10&west=-10&east=40&north=70&south=20&sig=0');
  2. print_r($section);

To jest 10 tablic ale ja potrzebuję wyciągnąć każdą wartość osobno.
viking
A tak ciężko pomyśleć? Przeiteruj każdą, zamień każdą iterację z json na array i dodaj sobie np do jednej tablicy albo od razu wyświetl na stronie jeśli taką masz wizję.
nospor
Cytat(viking @ 7.02.2022, 10:45:21 ) *
A tak ciężko pomyśleć? Przeiteruj każdą, zamień każdą iterację z json na array i dodaj sobie np do jednej tablicy albo od razu wyświetl na stronie jeśli taką masz wizję.

"Najlepsze" jest to, ze juz mu to pisano milion razy tutaj ale po co czytac.. Lepiej skupiac sie tylko bezmyslnie na ostatnim poscie :/
nospor
@dublinka on wie ze jest json_decode. On poprostu nie rozumie, ze ma tego teraz uzyc w petli np FOREACH na tablicy $section
brzanek
Czy coś takiego?
  1. $section = file('https://'.$loginname.':'.$password.'@data.blitzortung.org/Data/Protected/last_strikes.php?number=10&west=-10&east=40&north=70&south=20&sig=0');
  2. $arr = json_decode($section, true);
  3. foreach($arr['result'] as $klucz => $wartosc){
  4. echo $wartosc['lat'];
  5. }
nospor
Najpierw FOREACH a potem json_decode. No przeciez caly czas masz to mowione... przeciez $section to tablica a nie json co sam widziales no nie?

  1. $section = file('https://'.$loginname.':'.$password.'@data.blitzortung.org/Data/Protected/last_strikes.php?number=10&west=-10&east=40&north=70&south=20&sig=0');
  2. foreach($section as $el){
  3. $odkodowanyjson = json_decode($el);
  4.  
  5. }
brzanek
No dobrze ale
  1. $section = file('https://'.$loginname.':'.$password.'@data.blitzortung.org/Data/Protected/last_strikes.php?number=10&west=-10&east=40&north=70&south=20&sig=0');
  2. foreach($section as $el){
  3. $odkodowanyjson = json_decode($el);
  4. }
  5. echo $odkodowanyjson->lat;

pokazuje tylko jedną wartość a powinno chyba 10 wartości z lat?
nospor
facepalmxd.gif
Wlacz w koncu myslenie... po cos ta petla tam jest przeciez.

  1. $section = file('https://'.$loginname.':'.$password.'@data.blitzortung.org/Data/Protected/last_strikes.php?number=10&west=-10&east=40&north=70&south=20&sig=0');
  2. foreach($section as $el){
  3. $odkodowanyjson = json_decode($el);
  4. echo $odkodowanyjson->lat;
  5. }
  6.  
dublinka
Zapewne teraz bedzie pytanie jak wyswietlic konkretne dane z danej linii
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.