json array omzetten en loop
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:
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)
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)
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)
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.
Toevoeging op 29/01/2018 21:44:04:
location zal bij voorbeeld 1 geen array zijn en bij voorbeeld twee wel.
Dit zou ook uit de specs moeten blijken, hier zou iets over de vorm van "location" vermeld moeten staan.
Levert:
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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));
?>
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)
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
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
)
)
)
(
[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
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.
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.
Goede morgen allen, enorm bedankt voor de reacties!
Ik zal idd kijken of de key bestaat
@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!
Ik zal idd kijken of de key bestaat
Code (php)
1
2
3
4
5
6
7
8
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
}
}
//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!




