Formatowanie zapytania z bazy do formatu JSON

0

Hej,

Mam zapytanie do bazy, ktore wyglada tak:

$query = "SELECT s.departure_time
	FROM stop_times s 
	JOIN trips t ON s.trip_id = t.trip_id 
	JOIN calendar c ON t.service_id = c.service_id 
	WHERE monday =1 
	AND start_date = '$start_date'
	AND s.stop_id ='$stop_id' 
	AND t.route_id ='$route_id'

Wyrzucam sobie to w JSON i otrzymuje:

[{"departure_time":"0400"},{"departure_time":"0400"},{"departure_time":"0500"},{"departure_time":"0500"},{"departure_time":"0600"},{"departure_time":"0600"},{"departure_time":"0700"},{"departure_time":"0700"},{"departure_time":"0700"},{"departure_time":"0800"},{"departure_time":"0800"},{"departure_time":"0900"},{"departure_time":"1000"},{"departure_time":"1000"},{"departure_time":"1100"},{"departure_time":"1200"},{"departure_time":"1200"},{"departure_time":"1300"},{"departure_time":"1300"},{"departure_time":"1400"},{"departure_time":"1400"},{"departure_time":"1500"},{"departure_time":"1500"},{"departure_time":"1600"},{"departure_time":"1600"},{"departure_time":"1600"},{"departure_time":"1700"},{"departure_time":"1700"},{"departure_time":"1800"},{"departure_time":"1800"},{"departure_time":"1800"},{"departure_time":"1900"},{"departure_time":"1900"},{"departure_time":"2000"},{"departure_time":"2000"},{"departure_time":"2100"},{"departure_time":"2200"}]

Taka postac nie bardzo mnie satysfakcjonuje. Chcialbym aby rezultat byl pogrupowany tzn. uzyskac coos takiego "4 - 04, 50", "5 - 28, 54" itd. Nie wiem tylko na ktorym etapie powienienm probowac to uzyskac (zapytanie do bazy czy php pozniej), no i szczerze mowiac nie bardzo wiem jaka powinna byc finalna postac. Czy powinienem miec obiekt JSON symbolizujacy godzine 4 i w nim tablice z elementami (minuty) czy moze jakis inny sposob?

Bylbym wdzieczny za pomoc.
Pzdr.

1

Najprościej będzie chyba tak:

$row['departure_time'] = "4:02:00"; //zakładam, że tak wygląda pobrany z bazy rekord
...
while($row = mysqli_fetch_assoc($query))
{
$split = explode(":",$row['departure_time']);
if(is_null($godzina[$split[0]])) $godzina[$split[0]] = array();
array_push($godzina[$split[0]],$split[1]);
}
print_r(json_encode($godzina)); //to zwróci wynik w stylu {"4":["02","12"],"5":["32"],"6":["11"]}
0

Dokladnie o to mi chodzilo. Wielkie, wielkie dzieki! :)

0

Jeszcze tylko takie pytanie, jak dodac do tego nazwy pol?

{"04":["04","50"],"05":["28","54"],"06":["29","49"],"07":["05","26","58"],"08":["25","56"],"09":["44"],"10":["18","44"],"11":["45"],"12":["19","41"],"13":["08","54"],"14":["21","46"],"15":["12","38"],"16":["05","34","57"],"17":["26","48"],"18":["13","39","59"],"19":["25","58"],"20":["24","42"],"21":["41"],"22":["35"]}

Zeby godzina wychodzila w postaci "godzina":"04" a pod tym bylo "minuty":["minuta":"04","minuta":"50"]

0

Musisz mieć te nazwy w formacie JSON? Nie lepiej będzie po prostu dopisać przy wyświetlaniu?
Jeśli jednak koniecznie tak chcesz, to w ten sposób chyba wyjdzie:

if(is_null($godzina['godzina'][$split[0]])) $godzina['godzina'][$split[0]]['minuty'] = array();
array_push($godzina['godzina'][$split[0]]['minuty'],$split[1]);

Wtedy wyjdzie coś takiego:

{
"godzina":{
    "4":{
        "minuty":["02","12"]},
    "5":{
        "minuty":["32"]},
    "6":{
        "minuty":["11"]}
    }
}

Z resztą mogłeś to już samemu ogarnąć, nic trudnego w tym nie ma ;)

0

Heh moze rzeczywiscie bylem troche leniwy pytajac o to drugie. Jeszcze troche brakuje do postaci ktorej potrzebuje ale postaram sie to rozwiazac sam i zamieszcze rozwiazanie :)

Pozdrawiam

0

Poleglem... Bede jeszcze probowal, ale nie jestem w PHP tak biegly.

{
"godziny":
[
{
"godzina":"05",
"minuty":
[
{
"minuta":"05"
},
{
"minuta":"12"
},
{
"minuta":"25"
},
{
"minuta":"38"
}
]
}
]
}

To jest postac JSON ktora chcialbym otrzymac na koniec.

Pzdr

1

No faktycznie, jest z tym więcej zabawy :) Trzeba sobie dorobić funkcję, bo przez to zagnieżdżanie + asocjację ciężko sprawdzić, czy mamy już tą godzinę w tablicy.

function znajdzGodzine($id, $array) {
	foreach ($array as $key => $val) {
		if ($val['godzina'] === $id) {
			return $key;
		}
	}
	return null;
}

$godzina['godziny'] = array();
while($row = mysqli_fetch_assoc($query))
{
	$split = explode(":",$row['departure_time']);
	$key = znajdzGodzine($split[0], $godzina['godziny']);

	if($key === null) 
	{
		array_push($godzina['godziny'],array("godzina" => $split[0]));
		$key = znajdzGodzine($split[0], $godzina['godziny']); //dodaliśmy element, więc musimy pobrać jego ID żeby zrobić coś dalej
	}
	if(is_null($godzina['godziny'][$key]['minuty'])) $godzina['godziny'][$key]['minuty'] = array();
	array_push($godzina['godziny'][$key]['minuty'], array("minuta" => $split[1]));

}
$wynik = json_encode($godzina);
0

Mega ogromne dzieki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1