[php] json decode naar html in PHP

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 07-10 15:15

zeroday

There is no alternative!

Topicstarter
Ik zit een beetje te stoeien met de schiphol api en probeer de json te decoden naar een simpele html pagina in php


$json = json_decode($result, true);

if (count($json['flights'])) {

foreach ($json['flights'] as $flights)
{

echo "Vluchtnaam: $flights[flightName] <br />";

}

en dan krijg ik alle vluchten terug alleen ik heb veel meer data wat ik bij het juiste vluchtnummer wil tonen

Alleen er zijn een aantal arrays onder flights die wat dieper gaan

['flights'][0]['publicFlightState']['flightStates'] as $state)
of
['flights'][0]['baggageClaim']['belts'] as $belts)

Als ik dit afzonderlijk in een foreach zet dan komt er wel data uit, maar ik krijg dan continue de info van de eerste array terug en niet de daarop volgende ..
dus vluchtnummer
12345
AAA
00001
AAA

Waar de A dus verkeerd uitgelezen wordt.

Hoe loop ik nu door de data heen zodat per 'vlucht' ik alle data netjes van alle vluchten kan tonen?

Ik heb code die wel de eerste array toont en dan alle gegevens goed neerzet,
maar die werkt met
$json = json_decode($result);
en niet met de true.

maar dan krijg ik het niet voor elkaar om ['flights'][0]['publicFlightState']['flightStates'] te tonen

zie ook
https://github.com/aroundmyroom/Schiphol-API-JSON

PS. ik ben zo groen als gras met het programmeren ;_)

There are no secrets, only information you do not yet have


Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Moet je dan niet gewoon je 2e for-loop in de 1e zetten zoals:
PHP:
1
2
3
4
5
6
7
foreach ($json['flights'] as $flight)
{
    foreach ($flight['baggageClaim']['belts'] as $belt)
    {
        //...
    }
}


En ik zou de loop-variabelen in enkelvoud schrijven zoals ik hierboven heb gedaan.

Acties:
  • 0 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 07-10 15:15

zeroday

There is no alternative!

Topicstarter
Daos schreef op woensdag 22 maart 2017 @ 17:18:
Moet je dan niet gewoon je 2e for-loop in de 1e zetten zoals:
PHP:
1
2
3
4
5
6
7
foreach ($json['flights'] as $flight)
{
    foreach ($flight['baggageClaim']['belts'] as $belt)
    {
        //...
    }
}


En ik zou de loop-variabelen in enkelvoud schrijven zoals ik hierboven heb gedaan.
Gaat niet goed na de eerste array met gegevens. Ik krijg de vluchtnaam wel, die wordt 2x getoond omdat de status 2 waarden kan hebben (dat is een ander probleem, maar voor later)
dan voor de bagage krijg ik in principe ook 1 waarde, maar deze waarde komt altijd uit de eerste array
Heb de brackets al op 100 manieren geplaats maar geen idee
Ik denk zelfs dat de foreach niet continue hoeft, maar hoe ik dan de data uit de decoded meuk krijg..

code:
1
2
3
4
5
6
7
8
9
10
11
 if (count($json['flights']))
   foreach ($json['flights'] as $flights)

   foreach($json['flights'][0]['publicFlightState']['flightStates'] as $state)
   foreach ($json['flights'][0]['route']['destinations'] as $departed)
   foreach ($json['flights'][0]['baggageClaim']['belts'] as $belt)
{
   echo "Vluchtnaam: $flights[flightName] <br />";
   echo "status: $state <br />";
   echo "bagage: $belt <br />";
   echo "vertrek: $departed <br />";


resultaat

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Vluchtnaam: PS9468 
status: LND 
bagage: 11 
vertrek: NCE 
Vluchtnaam: PS9468 
status: EXP 
bagage: 11 
vertrek: NCE 
Vluchtnaam: CZ7829 
status: LND 
bagage: 11 
vertrek: NCE 
Vluchtnaam: CZ7829

There are no secrets, only information you do not yet have


Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Wat jij nu schrijft zijn 4 for-loops die genest zijn. Dit lijkt mij niet wat je wilt. En met jouw $json['flights'][0] pak je altijd de eerste vlucht. Met [] doe je een namelijk index en 0 is het eerste item. Dat is ook niet wat je wilt.

Je hebt 1 buitenste loop nodig die door de vluchten loopt en daarbinnen een paar die per vlucht de extra info tonen die in arraytjes zit. Ik had al een voorbeeld gegeven hoe je door de vluchten heen loopt en daar meer info ophaalt. Nog wat uitgebreider:

PHP:
1
2
3
4
5
6
7
8
9
foreach ($json['flights'] as $flight)
{
    echo "Vluchtnaam: {$flight['flightName']} <br />";

    foreach ($flight['baggageClaim']['belts'] as $belt)
    {
        echo "bagage: {$belt} <br />";
    }
}

Acties:
  • 0 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 07-10 15:15

zeroday

There is no alternative!

Topicstarter
oooohhh top ..

dit werkt direct.. hier kan ik mee verder ! .. super !!!
tis echt een combi van {} en [] (maar geen idee wat die 'bepalen')

Thanks.. mijn avond kan niet meer kapot !
Daos schreef op woensdag 22 maart 2017 @ 19:44:

Je hebt 1 buitenste loop nodig die door de vluchten loopt en daarbinnen een paar die per vlucht de extra info tonen die in arraytjes zit. Ik had al een voorbeeld gegeven hoe je door de vluchten heen loopt en daar meer info ophaalt. Nog wat uitgebreider:

PHP:
1
2
3
4
5
6
7
8
9
foreach ($json['flights'] as $flight)
{
    echo "Vluchtnaam: {$flight['flightName']} <br />";

    foreach ($flight['baggageClaim']['belts'] as $belt)
    {
        echo "bagage: {$belt} <br />";
    }
}

There are no secrets, only information you do not yet have


Acties:
  • 0 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 07-10 15:15

zeroday

There is no alternative!

Topicstarter
Daos schreef op woensdag 22 maart 2017 @ 19:44:
Wat jij nu schrijft zijn 4 for-loops die genest zijn. Dit lijkt mij niet wat je wilt. En met jouw $json['flights']\[0] pak je altijd de eerste vlucht. Met [] doe je een namelijk index en 0 is het eerste item. Dat is ook niet wat je wilt.

Je hebt 1 buitenste loop nodig die door de vluchten loopt en daarbinnen een paar die per vlucht de extra info tonen die in arraytjes zit. Ik had al een voorbeeld gegeven hoe je door de vluchten heen loopt en daar meer info ophaalt. Nog wat uitgebreider:

PHP:
1
2
3
4
5
6
7
8
9
foreach ($json['flights'] as $flight)
{
    echo "Vluchtnaam: {$flight['flightName']} <br />";

    foreach ($flight['baggageClaim']['belts'] as $belt)
    {
        echo "bagage: {$belt} <br />";
    }
}
nog wel een vraagje

2017-03-22T20:50:06.000+01:00

dit krijg ik als datum/tijd eruit maar dat zou ik wat beter willen zien
echo "Geroosterde landingstijd: {$flight['scheduleTime']} <br />";

ergens zou de datetime aanpassing gedaan moeten worden, maar waar?

There are no secrets, only information you do not yet have


Acties:
  • 0 Henk 'm!

  • martijncalker
  • Registratie: Januari 2017
  • Laatst online: 11-03-2021
Wellicht dat de strtotime in combinatie met date je wat verder kan helpen?

(en let op met tijdzone's ;) )

[ Voor 8% gewijzigd door martijncalker op 22-03-2017 21:49 ]


Acties:
  • 0 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 07-10 15:15

zeroday

There is no alternative!

Topicstarter
martijncalker schreef op woensdag 22 maart 2017 @ 21:48:
Wellicht dat de strtotime in combinatie met date je wat verder kan helpen?

(en let op met tijdzone's ;) )
iets .. maar hoe je dat dan tussen:
code:
1
 echo "Daadwerkelijke landingstijd: {$flight['actualLandingTime']} <br />";


stopt?

kijk dit was wel makkelijk: $scheduletime=date("H:i");
maar die bovenste moet netjes leesbaar worden.

There are no secrets, only information you do not yet have


Acties:
  • 0 Henk 'm!

  • ajakkes
  • Registratie: Maart 2004
  • Laatst online: 16-05 22:32

ajakkes

👑

$temp =date(strtotime($flight['actualLandingTime']) ;'Y-M-d') ;
Echo 'Bla'. $temp;

Zoiets maar dan netter.

👑


Acties:
  • 0 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 07-10 15:15

zeroday

There is no alternative!

Topicstarter
met dank aan de hulp van hierboven ;-) komt nu het volgende eruit

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Vluchtdatum: 2017-03-23 
Vluchtnaam: MH5656 
Geroosterde landingstijd: 07:50:00 
Verwachte landingstijd: 2017-03-23T07:32:31.000+01:00 
Daadwerkelijke landingstijd: 2017-03-23T07:32:31.000+01:00 
Geparkeerd aan Gate: A04 
Bagageband: 13 
Vertrek luchthaven: BRU 
Ook bekend onder Vluchtnummer: CZ7782 
Ook bekend onder Vluchtnummer: DL9424 
Ook bekend onder Vluchtnummer: MH5656 
Ook bekend onder Vluchtnummer: 9W8556 
Status van de vlucht: LND 
Status van de vlucht: EXP


De Daadwerkelijke landingstijd: 2017-03-23T07:32:31.000+01:00 krijg ik nog niet omgezet, ook niet met de voorbeelden ergens gaat er wat
mis als je de array van de json wil omzetten in een variabele

dit is ongeveer de code geworden

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   if (count($json['flights']))
   foreach ($json['flights'] as $flights)

foreach ($json['flights'] as $flight)
{

    echo "Vluchtdatum: {$flight['scheduleDate']} <br />";
    echo "Vluchtnaam: {$flight['flightName']} <br />";
    echo "Geroosterde landingstijd: {$flight['scheduleTime']} <br />";
    echo "Verwachte landingstijd: {$flight['estimatedLandingTime']} <br />";
    echo "Daadwerkelijke landingstijd: {$flight['actualLandingTime']} <br />";
    echo "Geparkeerd aan Gate: {$flight['gate']} <br />";

    foreach ($flight['baggageClaim']['belts'] as $belt)
    {
        echo "Bagageband: {$belt} <br />";
    }


ben benieuwd of je ook nog kan selecteren op de waarde die je krijgt

code:
1
2
3
4
 foreach ($flight['publicFlightState']['flightStates'] as $status)
   {
     echo "Status van de vlucht: {$status} <br />";
   }


Status van de vlucht: LND
Status van de vlucht: EXP

zo was de status de tweede uitvoer: EXP en is de status nu LND ze staan beide onder elkaar in de array maar hoe je of de eerste of de 2e kan selecteren is dan nog de vraag ..

Ben in ierder geval blij dat er nu fatsoenlijke data uitkomt ondanks dat ik onder water nog wat meldingen van

PHP Warning: Invalid argument supplied for foreach() in /html//index.php on line 73 en die dan verwijst naar de status van de vlucht

code:
1
2
3
4
   foreach ($flight['codeshares']['codeshares'] as $joinedwith)
    {
      echo "Ook bekend onder Vluchtnummer: {$joinedwith} <br />";
    }

[ Voor 3% gewijzigd door zeroday op 23-03-2017 07:58 ]

There are no secrets, only information you do not yet have


Acties:
  • 0 Henk 'm!

  • EagleTitan
  • Registratie: Januari 2004
  • Niet online
zeroday schreef op donderdag 23 maart 2017 @ 07:57:
[...]

Ben in ierder geval blij dat er nu fatsoenlijke data uitkomt ondanks dat ik onder water nog wat meldingen van

PHP Warning: Invalid argument supplied for foreach() in /html//index.php on line 73 en die dan verwijst naar de status van de vlucht

code:
1
2
3
4
   foreach ($flight['codeshares']['codeshares'] as $joinedwith)
    {
      echo "Ook bekend onder Vluchtnummer: {$joinedwith} <br />";
    }
Misschien moet je wat zorgvuldiger te werk gaan (of staat er werkelijk 2x de key codeshares genest in elkaar? - edit: Ja dus :/ )

Of in ieder geval even verder kijken dan direct hier je foutmelding dumpen om het vervolgens door anderen te laten oplossen.

spoiler:
Misschien heb je ook vluchten waar geen gedeelde code is?

[ Voor 6% gewijzigd door EagleTitan op 23-03-2017 09:45 . Reden: Data gecheckt ]


Acties:
  • 0 Henk 'm!

  • ajakkes
  • Registratie: Maart 2004
  • Laatst online: 16-05 22:32

ajakkes

👑

Je poept op dit moment alles uit zonder enige check. Zonder conversie.

Begin boven je echo's maar binnen je foreach loop eerst je velden te controleren en op te maken. Zet het in een tijdelijke variabele zodat je bij de echo die variabele kan printen. Doordat je dit nu niet doet lukt het niet.

👑


Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

zeroday schreef op donderdag 23 maart 2017 @ 07:57:
met dank aan de hulp van hierboven ;-) komt nu het volgende eruit

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Vluchtdatum: 2017-03-23 
Vluchtnaam: MH5656 
Geroosterde landingstijd: 07:50:00 
Verwachte landingstijd: 2017-03-23T07:32:31.000+01:00 
Daadwerkelijke landingstijd: 2017-03-23T07:32:31.000+01:00 
Geparkeerd aan Gate: A04 
Bagageband: 13 
Vertrek luchthaven: BRU 
Ook bekend onder Vluchtnummer: CZ7782 
Ook bekend onder Vluchtnummer: DL9424 
Ook bekend onder Vluchtnummer: MH5656 
Ook bekend onder Vluchtnummer: 9W8556 
Status van de vlucht: LND 
Status van de vlucht: EXP


De Daadwerkelijke landingstijd: 2017-03-23T07:32:31.000+01:00 krijg ik nog niet omgezet, ook niet met de voorbeelden ergens gaat er wat
mis als je de array van de json wil omzetten in een variabele
http://php.net/manual/en/class.datetime.php

Acties:
  • 0 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 07-10 15:15

zeroday

There is no alternative!

Topicstarter
Ik ga er vanavond mee aan de slag. Zoals gezegd: ik ben echt een null op het gebied van het programmeren en ben blij met alle feedback ;-) Ergens moet je beginnen en dat gedonder met

code:
1
2
3
4
<?php
  echo "Hello World!";
  echo "PHP is so easy!";
?>


dacht ik gehad te hebben ;)

There are no secrets, only information you do not yet have


Acties:
  • 0 Henk 'm!

  • Krukar
  • Registratie: September 2001
  • Laatst online: 08-10 16:42
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 if (count($json['flights']))
   foreach ($json['flights'] as $flights)

foreach ($json['flights'] as $flight)
{

    echo "Vluchtdatum: {$flight['scheduleDate']} <br />";
    echo "Vluchtnaam: {$flight['flightName']} <br />";
    echo "Geroosterde landingstijd: {$flight['scheduleTime']} <br />";
    echo "Verwachte landingstijd: {$flight['estimatedLandingTime']} <br />";
    echo "Daadwerkelijke landingstijd: {$flight['actualLandingTime']} <br />";
    echo "Geparkeerd aan Gate: {$flight['gate']} <br />";

    foreach ($flight['baggageClaim']['belts'] as $belt)
    {
        echo "Bagageband: {$belt} <br />";
    }
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if (!empty($json['flights']))
{

    $velden = array("scheduleDate","flightName","scheduleTime","scheduleTime","estimatedLandingTime","actualLandingTime");
    $namen = array("Vluchtdatum","Vluchtnaam","Geroosterde landingstijd","Verwachte landingstijd","Daadwerkelijke landingstijd","Geparkeerd aan Gate");

    foreach ($json['flights'] as $flight)
    {
        foreach($velden as $key => $veld) {
            ?>
            <?=$namen[$key]?>: <?=!empty($json['flights'][$veld]?$json['flights'][$veld]:"n.b."?> <br />
            <?php
        }
        if (!empty($flight['baggageClaim']['belts'])) {
            foreach ($flight['baggageClaim']['belts'] as $belt) {
                ?>
                <?=!empty($belt?"Bagageband: {$belt} <br/>":"")?> 
                <?php
            }
        }
    }
}


Iets netter gemaakt :)


Edit: en gelijk je datum dingetje conversie ff gefixt, verveelde me :p

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function isDatum($input)
{
    if (!$input) {
        return false;
    }
    try {
        new \DateTime($input);
        return true;
    } catch (\Exception $e) {
        return false;
    }
}

if (!empty($json['flights']))
{
    $velden = array("scheduleDate","flightName","scheduleTime","scheduleTime","estimatedLandingTime","actualLandingTime");
    $namen = array("Vluchtdatum","Vluchtnaam","Geroosterde landingstijd","Verwachte landingstijd","Daadwerkelijke landingstijd","Geparkeerd aan Gate");

    foreach ($json['flights'] as $flight)
    {
        foreach($velden as $key => $veld) {
            ?>
            <?=$namen[$key]?>:
            <?=!empty($json['flights'][$veld]
                ?isDatum($json['flights'][$veld])?date($json['flights'][$veld],'Y-M-d'):$json['flights'][$veld]
                :"n.b."
            ?>
            <br />
            <?php
        }
        if (!empty($flight['baggageClaim']['belts'])) {
            foreach ($flight['baggageClaim']['belts'] as $belt) {
                ?>
                <?=!empty($belt?"Bagageband: {$belt} <br/>":"")?>
                <?php
            }
        }
    }
}

[ Voor 34% gewijzigd door Krukar op 23-03-2017 16:59 ]


Acties:
  • 0 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 07-10 15:15

zeroday

There is no alternative!

Topicstarter
Oh kewl ..
had net dit voor elkaar gekregen

[code]
foreach ($flight['publicFlightState']['flightStates'] as $status)
$status_new = $flight['publicFlightState']['flightStates'][0];
$status_old = $flight['publicFlightState']['flightStates'][1];

echo "Status van de vlucht is: $status_new <br />";
echo "Status van de vlucht was: $status_old <br />";

ik ga jou code eens verwerken, vind die gedefinieerde array waarden ook mooi

There are no secrets, only information you do not yet have


Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
zeroday schreef op donderdag 23 maart 2017 @ 19:02:
[...]
code:
1
2
3
 foreach ($flight['publicFlightState']['flightStates'] as $status)
    $status_new = $flight['publicFlightState']['flightStates'][0];
    $status_old = $flight['publicFlightState']['flightStates'][1];
Waarom zet je hier als eerste een foreach? Dit voert de tweede regel met $status_new = een paar keer uit. Volgens mij moet die regel met foreach gewoon verdwijnen. Begrijp je wel wat je aan het doen bent of probeer je maar wat?

Acties:
  • 0 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 07-10 15:15

zeroday

There is no alternative!

Topicstarter
Daos schreef op donderdag 23 maart 2017 @ 19:36:
[...]

Waarom zet je hier als eerste een foreach? Dit voert de tweede regel met $status_new = een paar keer uit. Volgens mij moet die regel met foreach gewoon verdwijnen. Begrijp je wel wat je aan het doen bent of probeer je maar wat?
Ik doe maar wat om te begrijpen wat de gevolgen zijn en om zo de taal te doorgronden.
Soms moet je wel de foreach gebruiken en soms is het weer niet nodig .. arrays en objecten en wat al niet meer .. ;)

There are no secrets, only information you do not yet have


Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Snap je ook al wat een foreach doet, dan?

Acties:
  • 0 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 07-10 15:15

zeroday

There is no alternative!

Topicstarter
Radiant schreef op vrijdag 24 maart 2017 @ 07:32:
Snap je ook al wat een foreach doet, dan?
Ik dacht het wel, maar blijkbaar dus niet

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                     [codeshares] => Array
                        (
                            [codeshares] => Array
                                (
                                    [0] => DL9698
                                    [1] => SU4436
                                )

                        )

                    
                    [publicFlightState] => Array
                        (
                            [flightStates] => Array
                                (
                                    [0] => LND
                                    [1] => EXP
                                )


want in het eerste voorbeeld moet ik wel een foreach doen en in het tweede voorbeeld niet.
maar dat kan dan weer te maken hebben dat ik van de onderste de afzonderlijke resultaten afzonderlijk wil tonen.

There are no secrets, only information you do not yet have


Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Foreach loopt door elementen in een array heen en plaatst de waarde in een lokale variabele zodat je, ongeacht de grootte van de array, makkelijk door elementen heen kan lopen, maar dat kan uiteraard ook door zelf de index op te geven.

Voorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$array = ['abc', 'def', 'ghi'];
foreach ($array as $value) {
  echo $value . PHP_EOL;
}

for ($i = 0; $i < count($array); $i++) {
  echo $array[$i] . PHP_EOL;
}

echo $array[0] . PHP_EOL;
echo $array[1] . PHP_EOL;
echo $array[2] . PHP_EOL;


Dit geeft allemaal hetzelfde resultaat. Uiteraard moet je er altijd wel voor zorgen dat je weet hoe groot de array is. Als je bijvoorbeeld altijd het eerste element alleen wil kan je index 0 lezen, maar check wel of die index wel bestaat (want de array kan ook leeg zijn).

[ Voor 17% gewijzigd door Radiant op 25-03-2017 12:40 ]


Acties:
  • 0 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 07-10 15:15

zeroday

There is no alternative!

Topicstarter
thanks voor alle input tot nu toe

https://github.com/aroundmyroom/Schiphol-API-JSON/

momenteel worden alle aankomende vluchten van een bepaalde tijd getoond, de luchthaven en land waarvandan komt wordt via een 2e api call aangeroepen en de statussen die verkregen wordt worden omgezet naar een wat meer leesbaarder geheel.

Al met al tot nu toe tevreden wat ik eruit krijg ;-)

There are no secrets, only information you do not yet have

Pagina: 1