PHP: JSON in CSV konvertieren

canju

Erfahrenes Mitglied
Hallo ihr Lieben,

ich bin hier gerade am verweifeln und hoffe ihr könnt mir (mal) wieder helfen.

Ich lade mir über einen api call via basic auth eine .json datei auf einen ftp.
Ich möchte diese .json Datei jetzt mit PHP in eine .csv Datei convertieren. Ich kriege das einfach nicht hin (ich würde am liebsten gerade in den Tisch beißen). Habe schon einige Scripte vergebens ausprobiert. meist ist der Fehler, dass nach dem json_decode kein Array vorliegt.

Der Inhalt der .json Datei sieht so aus:

JSON:
{
   "status_code":200,
   "status_message":"OK",
   "data":[
      {
         "id":1234565,
         "status":"confirmed",
         "amount_net":453,
         "created":"2019-10-15 12:00:00",
         "tracking":"rrkkdje3-343-3434",
         "product":"car",
         "gclid":null,
         "referer_url":"",
         "cancel_reason":null
      },
      {
         "id":9876363,
         "status":"verg\u00fctet",
         "amount_net":13,
         "created":"2019-10-19 12:00:00",
         "tracking":"0984dd-e9934",
         "insurance":"boat",
         "gclid":null,
         "referer_url":"",
         "cancel_reason":null
      }
   ]
}

Ich bräuchte jetzt die "Datensätze" innerhalb von "data":[...] jeweils als eigene Zeile in der .csv Datei. Inkl. Überschriften.

Könte mir evtl. einer von euch Profis mit einem kleinen PHP Snippet das die json datei in csv konvertiert aushelfen?

Grüße,
Canju
 
Lösung
Statt die Resultate einfach hinter einander zu hängen, müssen wir die Arrays zusammen führen durch die Funktion array_merge:
PHP: array_merge - Manual
(Ein Kommentar dort sagt, dass das Anhängen mit einer Schleife um Längen schneller ist aber um den Code kurz zu halten habe ich mal array_merge verwendet).
Code:
$bearer_token = 'token';
//API KEY AND PASSWORD
$headers = array("Authorization: Bearer $bearer_token", 'Content-Type: application/json');
$current_datetime = date("Y-m-d H:i:s");
$script_name = $_SERVER['SCRIPT_NAME'];
$dateObj = new DateTime();
$dateObj->modify('-12 months');
$responseArr = [];
for ($i = 0; $i < 13; $i++) {
    // prepare start and end time and URL:
    $start_date = $dateObj->format('Y-m-d')...
Es scheint als hätte ich es jetzt mit einer foreach schleife hinbekommen.
Falls nochmal ein Newbie wie ich auf der suche nach Ähnlichem ist:

Die for schleife "einfach" durch eine foreach schleife ersetzen

PHP:
foreach ($data as $row) {
  //get data details
  $id = $row['id'];
  $commission = $row['transactionParts'][0]['commissionAmount'];

  // replace empty fields with null
  if($id == '' OR !isset($id)){$id = null;};
  if($commission == '' OR !isset($commission)){$commission = null;};

  //insert into mysql table
    $insert_data = <<<SQL
    INSERT INTO $table_name(
                  id,
                  commission
                )
                VALUES(
                  '$id',
                  '$commission'
                )
    SQL;

    $result = mysqli_query($db, $insert_data);
    if ($result == false) {
        echo 'Error description \n' . mysqli_error($db);
    }
}
 
Du hättest hier
PHP:
$id = $data[0]['id'];
$commission = $data[0]['transactionParts'][0]['commissionAmount'];
in geändert
$id = $data[$i]['id'];
$commission = $data[$i]['transactionParts'][0]['commissionAmount'];
Das hätte gereicht.
Die for schleife "einfach" durch eine foreach schleife ersetzen
Das geht natürlich auch.
Kommen den jetzt alle Einträge in der DB an ?
 
Du hättest hier
PHP:
$id = $data[0]['id'];
$commission = $data[0]['transactionParts'][0]['commissionAmount'];
in geändert
$id = $data[$i]['id'];
$commission = $data[$i]['transactionParts'][0]['commissionAmount'];
Das hätte gereicht.

Das geht natürlich auch.
Kommen den jetzt alle Einträge in der DB an ?

Ja, die Daten kommen jetzt rein.

Das:
PHP:
$id = $data[$i]['id'];
$commission = $data[$i]['transactionParts'][0]['commissionAmount'];
hatte ich auch probiert, hat aber nicht funktioniert, da so wie ich das verstanden habe die [0] die "Tiefe" des arrays angibt und nicht die "Zeilenanzahl".
 
da so wie ich das verstanden habe die [0] die "Tiefe" des arrays angibt und nicht die "Zeilenanzahl".
Nein, das trifft nicht zu, dieses [0] ist der Index bzw. die Nummer des Elementes im Array. $data[0] wäre demnach das erste Element und $data[1] das zweite usw.
Ich stimme mit Basti überein das es so auch funktionieren müsste.
 
Ok, mein fehler, dann hab ich bestimmt irgendwas falsch gemacht. Mit foreach klappts jetzt zum glück. Danke euch beiden,
 
Zurück