json array omzetten en loop

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Dennis WhoCares

Dennis WhoCares

29/01/2018 21:22:26
Quote Anchor link
Goede avond allen,

ik zit met een nieuwe helpdesk systeem te spelen.
Het 'source' systeem geeft mij Json code terug.
Een van de key's is : 'location'

Ik weet niet goed hoe ik het moet uitleggen, dus geef ik 2 voorbeelden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
{"location":{"lat":"-104.985352","lon":"39.690281","name":"DN-WH"}}

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
{"location":[{"lat":"-104.985352","lon":"39.690281","name":"DN-WH"},{"lat":"-98.591137","lon":"37.961862","name":"ST-DC"}]}


Dmv json_decode($row->location,true); kan ik een van location gewoon een array maken.

Maar hoe kan ik makkelijk zien of location 1 of meerdere locations bevat ?
(iets anders dan.. if(stristr($row->location,'{"location":[{' !== false) ;-D
count($row->location) == 3 (indien er 1 location in staat, maar is ook 3 als er 3 locations in staan)
 
PHP hulp

PHP hulp

19/05/2024 10:11:39
 
Frank Nietbelangrijk

Frank Nietbelangrijk

29/01/2018 21:43:27
Quote Anchor link
Met php's functie is_array()



Toevoeging op 29/01/2018 21:44:04:

location zal bij voorbeeld 1 geen array zijn en bij voorbeeld twee wel.
 
Thomas van den Heuvel

Thomas van den Heuvel

29/01/2018 23:51:44
Quote Anchor link
Dit zou ook uit de specs moeten blijken, hier zou iets over de vorm van "location" vermeld moeten staan.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
header('Content-Type: text/html; charset=UTF-8');

function
escape($s) {
    return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
}

function
dump($a) {
    echo '<pre>'.escape(print_r($a, true)).'</pre>';
}


$test1 = '{"location":{"lat":"-104.985352","lon":"39.690281","name":"DN-WH"}}';
$test2 = '{"location":[{"lat":"-104.985352","lon":"39.690281","name":"DN-WH"},{"lat":"-98.591137","lon":"37.961862","name":"ST-DC"}]}';

dump(json_decode($test1, true));
dump(json_decode($test2, true));
?>

Levert:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
Array
(
    [location] => Array
        (
            [lat] => -104.985352
            [lon] => 39.690281
            [name] => DN-WH
        )
)
Array
(
    [location] => Array
        (
            [0] => Array
                (
                    [lat] => -104.985352
                    [lon] => 39.690281
                    [name] => DN-WH
                )

            [1] => Array
                (
                    [lat] => -98.591137
                    [lon] => 37.961862
                    [name] => ST-DC
                )
        )
)

Een eerste idee is wellicht: controleren op het bestaan van één van de keys "lat", "lon", "name". Zoja: er is maar één locatie, zonee: er zijn meerdere locaties... of wellicht géén locaties als dat een optie is (zie wederom specs).

Controleren op het bestaan van één van de keys kun je het beste doen met array_key_exists(). Dat is meestal de beste optie, omdat je dan niet in de problemen komt met mogelijke rare randgevallen (null waarden enzo) maar ook dat... zou opgehelderd moeten worden door de specificatie, mogelijk kun je dan werken met isset() of empty() ofzo.

Maar eerst moet je weten WAT je mogelijk terug kunt krijgen en in WELKE VORM. Pas dan kun je een fatsoenlijk (en volledig) gevalsonderscheid gaan toepassen. Daarvoor zijn specificaties geschreven.
Gewijzigd op 29/01/2018 23:52:13 door Thomas van den Heuvel
 
Frank Nietbelangrijk

Frank Nietbelangrijk

30/01/2018 09:17:50
Quote Anchor link
Ach natuurlijk In voorbeeld 1 krijgen we een associatieve array. Er zijn wel fancy functies geschreven om te testen of een array associatief is of niet maar zoals Thomas zegt lijkt het me sneller om gewoon het bestaan van een key te testen. Het enige punt is dan wel dat je er van op aan moet kunnen dat die ene key of keys waarop je wilt testen dan ook consequent aanwezig zijn. Dit zou inderdaad uit de specificaties kunnen blijken maar mijn ervaring is dat deze vaak ontbreken en dan mag je het dus zelf uitzoeken helaas.
 
Thomas van den Heuvel

Thomas van den Heuvel

30/01/2018 15:56:12
Quote Anchor link
Het feit dat location gewoon niet altijd een array bevat stemt niet heel erg hoopvol. Dat zou uit oogpunt van uniformiteit / gemak van afhandeling een stuk handiger zijn geweest.
 
Dennis WhoCares

Dennis WhoCares

31/01/2018 07:24:01
Quote Anchor link
Goede morgen allen, enorm bedankt voor de reacties!
Ik zal idd kijken of de key bestaat
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
if(array_key_exists('lat',$row->location)) {
  //single location
} else {
  //multiple locations
  foreach($row->location as $location) {
    //data for location
  }
}


@Thomas, bedankt voor de tip! Eigenlijk wel dom van me..
Inderdaad is het niet erg handig om de ene keer direct de associative array te geven, en bij meerdere een gewone array met associative arrays erin.

@Frank, dit had ik inderdaad geprobeerd, maar dat ging niet helemaal lekker.

Ik weet niet of dit php of server gericht is, maar ik draai nu php7 op nginx.

Anyways solved! Thanks guys!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.