json array omzetten en loop
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)
is_array()
Toevoeging op 29/01/2018 21:44:04:
location zal bij voorbeeld 1 geen array zijn en bij voorbeeld twee wel.
Met php's functie Toevoeging op 29/01/2018 21:44:04:
location zal bij voorbeeld 1 geen array zijn en bij voorbeeld twee wel.
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
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.
Ach natuurlijk In voorbeeld 1 krijgen we een associatieve array. Er zijn wel 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.
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!