json met meerdere array's uitlezen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bas van de Ven

Bas van de Ven

08/03/2020 20:47:01
Quote Anchor link
In een json string lever ik een array aan met daarin 3 array's. Nl. Geboortes, Verplaatsingen en Behandel_Ziekte. Elk van deze drie array's bevatten velden (elementen) die ik in een gelijknamige tabel inlees.
Zo ziet de json string eruit :

[
{
"Geboorte": [
{
"moeder": "100211528287",
"datum": "2020-03-08T00:00:00",
"ras": "4",
"verblijf": "2",
"verloop": "Zonder hulp",
"geboren": "2",
"levend": "1",
"moment_dood": "2",
"reden_dood": "Doodgeboorte",
"registratie": "0",
"lammeren": [
{
"lam": "100211228286",
"geslacht": "1",
"gewicht": 1.0,
"status": "1"
}
]
},
{
"moeder": "100211928285",
"datum": "2020-03-08T00:00:00",
"ras": "4",
"verblijf": "2",
"verloop": "Licht met hulp",
"geboren": "3",
"levend": "3",
"moment_dood": "",
"reden_dood": "",
"registratie": "0",
"lammeren": [
{
"lam": "100211528287",
"geslacht": "1",
"gewicht": 2.0,
"status": "1"
},
{
"lam": "100211928285",
"geslacht": "0",
"gewicht": 2.9,
"status": "1"
},
{
"lam": "100211628284",
"geslacht": "1",
"gewicht": 1.5,
"status": "1"
}
]
}
],
"Verplaatsing": [
{
"wat": "Dood",
"datum": "2020-02-27T00:00:00",
"levensnummer": "100211228286",
"ubn_best": "",
"verkoopreden": "",
"oorzaak": "39",
"moeder": null,
"gewicht": 1.0,
"groep": "",
"ubn_herk": "",
"melden": "2",
"verblijf": ""
},
{
"wat": "Afvoer",
"datum": "2020-02-27T00:00:00",
"levensnummer": "100211928285",
"ubn_best": "6250036",
"verkoopreden": "reden1",
"oorzaak": "",
"moeder": null,
"gewicht": 0.0,
"groep": "",
"ubn_herk": "",
"melden": "2",
"verblijf": ""
},
{
"wat": "Aanvoer",
"datum": "2020-02-27T00:00:00",
"levensnummer": "100211628284",
"ubn_best": "6250036",
"verkoopreden": "",
"oorzaak": "",
"moeder": null,
"gewicht": 0.0,
"groep": "",
"ubn_herk": "",
"melden": "2",
"verblijf": ""
},
{
"wat": "Overleggen",
"datum": "2020-02-27T00:00:00",
"levensnummer": "100211628284",
"ubn_best": "",
"verkoopreden": "",
"oorzaak": "",
"moeder": "100211228286",
"gewicht": 0.0,
"groep": "",
"ubn_herk": "",
"melden": "2",
"verblijf": ""
}
],
"Behandel_Ziekte": [
{
"wat": "Ziekte registratie",
"datum": "2020-02-29T00:00:00",
"dier_of_groep": "1",
"ziekte": "1",
"behandel_vlgs_plan": "",
"keuze_plan": "",
"registratie_plan": "",
"gebruik_PMSG": "",
"medicijn": "",
"aantal": 0.0,
"controle_dag": 0,
"levensnummer": "100211528287",
"diernr": "",
"verblijf": "3"
},
{
"wat": "Ziekte + Behandeling",
"datum": "2020-02-29T00:00:00",
"dier_of_groep": "1",
"ziekte": "2",
"behandel_vlgs_plan": "Ja",
"keuze_plan": "1",
"registratie_plan": "",
"gebruik_PMSG": "",
"medicijn": "",
"aantal": 0.0,
"controle_dag": 0,
"levensnummer": "100211228286",
"diernr": "",
"verblijf": "30"
},
{
"wat": "Behand + Medicijn",
"datum": "2020-02-29T00:00:00",
"dier_of_groep": "1",
"ziekte": "",
"behandel_vlgs_plan": "Ja",
"keuze_plan": "1",
"registratie_plan": "",
"gebruik_PMSG": "",
"medicijn": "",
"aantal": 0.0,
"controle_dag": 0,
"levensnummer": "100211928285",
"diernr": "",
"verblijf": ""
},
{
"wat": "Behand - Medicijn",
"datum": "2020-02-29T00:00:00",
"dier_of_groep": "1",
"ziekte": "",
"behandel_vlgs_plan": "Ja",
"keuze_plan": "1",
"registratie_plan": "",
"gebruik_PMSG": "",
"medicijn": "",
"aantal": 0.0,
"controle_dag": 0,
"levensnummer": "100211628284",
"diernr": "",
"verblijf": "28"
},
{
"wat": "Spons aanbrengen",
"datum": "2020-02-29T00:00:00",
"dier_of_groep": "1",
"ziekte": "",
"behandel_vlgs_plan": "Ja",
"keuze_plan": "1",
"registratie_plan": "",
"gebruik_PMSG": "",
"medicijn": "",
"aantal": 0.0,
"controle_dag": 0,
"levensnummer": "100211528287",
"diernr": "",
"verblijf": ""
},
{
"wat": "Spons eruit",
"datum": "2020-02-29T00:00:00",
"dier_of_groep": "1",
"ziekte": "",
"behandel_vlgs_plan": "",
"keuze_plan": "",
"registratie_plan": "",
"gebruik_PMSG": "Ja",
"medicijn": "",
"aantal": 12.0,
"controle_dag": 0,
"levensnummer": "100211928285",
"diernr": "",
"verblijf": ""
},
{
"wat": "Ziekte registratie",
"datum": "2020-02-29T00:00:00",
"dier_of_groep": "1",
"ziekte": "1",
"behandel_vlgs_plan": "",
"keuze_plan": "",
"registratie_plan": "",
"gebruik_PMSG": "",
"medicijn": "",
"aantal": 0.0,
"controle_dag": 0,
"levensnummer": "100211928285",
"diernr": "",
"verblijf": "1"
},
{
"wat": "Ziekte + Behandeling",
"datum": "2020-02-29T00:00:00",
"dier_of_groep": "1",
"ziekte": "3",
"behandel_vlgs_plan": "Nee",
"keuze_plan": "",
"registratie_plan": "1",
"gebruik_PMSG": "",
"medicijn": "1",
"aantal": 25.0,
"controle_dag": 8,
"levensnummer": "100211928285",
"diernr": "",
"verblijf": "29"
}
]
}
]

De json lees ik uit met
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
<?php
        $data
= json_decode($input);

$velden = array('Geboorte', 'Verplaatsing', 'Behandel_Ziekte');


             foreach($data as $index => $item) {                 
            
        
// Inlezen record
for($i = 0; $i<2; $i++) {

    if($i == 0) { $inhoud = $item -> {$velden[$i]} ; include "impGeboortes.php"; }
    if($i == 1) { $inhoud = $item -> {$velden[$i]} ; include "impVerplaatsing.php"; }
    /* if($i == 2) { include "impBehandelZiekte.php"; }*/    

             }


             }

?>


Met impGeboortes.php lees ik de geboortes in.
Met impVerplaatsing.php lees ik verplaatsingen in.

Als ik
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php if($i == 0) { $inhoud = $item -> {$velden[$i]} ; include "impGeboortes.php"; } ?>
uit commentariseer dan wordt Verplaatsingen ingelezen anders wordt enkel Geboortes ingelezen. Er wordt dus maar 1 loop uitgevoerd lijkt het.

Wat is hiervan de reden ?
 
PHP hulp

PHP hulp

28/11/2021 00:02:32
 
Coen Kolk

Coen Kolk

09/03/2020 09:14:07
Quote Anchor link
Dit komt omdat Geboorte, Verplaatsing en Behandel_Ziekte weer eerst in een array zitten dus $data[0]['Geboorte'].
Oplossing is:

Of
- De startende [ en eindigende ] uit je json weghalen

Of
- Een reset van je $data array doen: $data = reset(json_decode($input));

Of
Lopen door het eerste element: foreach($data[0] as $index => $item) {
 
Frank Nietbelangrijk

Frank Nietbelangrijk

09/03/2020 09:24:35
Quote Anchor link
Al eens gebrobeerd om json_decode te gebruiken met de tweede parameter op true? Je krijgt dan gewoon een associatieve array in PHP en geen object wat het naar mijn mening allemaal alleen maar lastiger maakt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$data
= json_decode($input, true);
echo '<pre>' . print_r($data, true) . '</pre>';
?>
 
Thomas van den Heuvel

Thomas van den Heuvel

09/03/2020 15:59:24
Quote Anchor link
Bas van de Ven op 08/03/2020 20:47:01:
Als ik ... code ... uit commentariseer dan wordt Verplaatsingen ingelezen anders wordt enkel Geboortes ingelezen. Er wordt dus maar 1 loop uitgevoerd lijkt het.

Beide worden volgens mij gewoon uitgevoerd, want je zit nog steeds in een loop?
EDIT: dit zou je kunnen testen door wat echo's toe te voegen.

Die buitenste foreach doet trouwens volgens mij niet zoveel. Of liever, in het ergste geval worden de imports meerdere keren uitgevoerd?

Bas van de Ven op 08/03/2020 20:47:01:
Wat is hiervan de reden ?

edit: geen idee, maar de code zit gewoon verkeerd in elkaar - deze is een rommeltje. Uiteindelijk wordt wel de administratie gedaan (of toch niet?) maar de manier waarop verdient zeker geen schoonheidsprijs.

En zoals @Frank aanhaalt hoeft niet alles via objecten te verlopen. Maar dat nu aanpassen kan ook consequenties hebben voor de importbestanden, die gaan namelijk op dit moment mogelijk uit van objecten.

edit: de code ziet er ook uit alsof er met verschillende ideeën is gewerkt:
- een onderscheid tussen imports via $velden
- maar gewoon door de data heenrennen middels een foreach-loop over $data
- een gevalsondescheid op index $i

Vreemd genoeg is er niet expliciet gekozen voor één aanpak maar lopen deze allemaal door elkaar :p.
Gewijzigd op 09/03/2020 16:07:54 door Thomas van den Heuvel
 
Michael -

Michael -

09/03/2020 18:19:20
Quote Anchor link
Omdat je op regel 11 hebt staan
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php for($i = 0; $i<2; $i++) { ?>

Dus minder dan 2... wat betekent dat 2 niet wordt uitgevoerd en je if $i == 2 op regel 15 dus niet voorkomt.
Verander regel 11 naar
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php for($i = 0; $i<=2; $i++) { ?>
 
Thomas van den Heuvel

Thomas van den Heuvel

09/03/2020 19:19:52
Quote Anchor link
@Michael, @Bas heeft het erover dat de verplaatsing import ($i == 1) niet wordt uitgevoerd tenzij de geboorte import ($i == 0) wordt uitgecommentarieerd. Er wordt verder niet gesproken over de ziekte behandeling import ($i == 2). Dit valt blijkbaar buiten het vraagstuk. Dit heeft dus niet te maken met $i < 2 vs $i <= 2 maar eerder wat de imports doen met $data en/of $item.

Bovenstaand voorstel heeft dus waarschijnlijk niet zoveel effect. Zoals aangegeven lopen er (ten minste) drie aanpakken door elkaar, en bovendien weten we niet wat er in de imports zelf gebeurt. Er zullen meerdere dingen op meerdere plekken gerepareerd moeten worden, enkel een < toevoegen gaat je in dit geval niet redden.
 
Bas van de Ven

Bas van de Ven

10/03/2020 18:21:31
Quote Anchor link
Het euvel zat hem in niet unieke namen van variabele. Het bestand impGeboortes.php had ook een loop die variabele $i had.
Dank voor jullie input. Ik heb er zeker wat aan gehad.
 



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.