Robert Ross Robert Ross - 2 months ago 5
PHP Question

Properly writing multiple json records to a JSON file using PHP

I have a simple functionality for adding products in JS and I am trying to save this products to a .json file using php.

My json objects in JS look like :

{id: 1474791226069, name: "prod", brand: "yhh", price: "2"}


And my php for saving them in my .json file is the following:

<?php
$data[] = $_GET['data'];

$inp = file_get_contents('products.json');
$tempArray = json_decode($inp);
array_push($tempArray, $data);
$jsonData = json_encode($tempArray);
var_dump($jsonData);
file_put_contents('products.json', $jsonData);
?>


Sadly, the result I get in my .json file looks a bit weird :

[["{\"id\":1474721566304,\"name\":\"GGG\",\"brand\":\"GG\",\"price\":\"3\"}"],["{\"id\":1474721570904,\"name\":\"GGGH\",\"brand\":\"GGH\",\"price\":\"4\"}"],["{\"id\":1474721574188,\"name\":\"GGGH\",\"brand\":\"GGHH\",\"price\":\"5\"}"]]


I've found it imposible to, let's say, look for a product by ID and delete or update it.
I know a .json file is not supposed to look like this, so my question is : How to make my .json file to look like a normal .json and still to be able to append new .json records from my JS, aka this:

[
{"id":1,"product":"one", "brand":"blah","price":"1"},
{"id":2,"product":"two", "brand":"blah","price":"2"},
{"id":3,"product":"three", "brand":"blah","price":"3"}
]


So I can be able to add new records, and decode/encode it in a more conventional way?

Please help!

Answer

From your comment,

$_GET['data'] is shown in the question, it is a json object like this {id: 1474791226069, name: "prod", brand: "yhh", price: "2"}

When decoding a json object, always pass the second parameter as true to convert the objects into associative arrays. Also, you have to use an additional array, for example, $resultData to achieve the desired result. So the solution would be like this:

$resultData = $tempArray = array();

$data = json_decode($_GET['data'], true);
if(($inp = file_get_contents('products.json')) != false){
    $tempArray = json_decode($inp, true);
}

array_push($tempArray, $data);
$resultData[] = $tempArray;
$jsonData = json_encode($tempArray);
file_put_contents('products.json', $jsonData);

var_dump($jsonData);