0

I made a function to retrieve some informations from a database table and store it in array, then I need to encode it in json specific format. This is the function:

public function json() { $query = "SELECT ax.nome as auxiliar, t.assiduidade, t.normas, t.eficiencia, t.relacionamento, t.iniciativa, t.visao, ( SELECT truncate(avg(t.assiduidade + t.normas + t.eficiencia + t.relacionamento + t.iniciativa + t.visao)/6, 2) FROM topico t WHERE a.id = t.idAval ) AS media FROM avaliacao a INNER JOIN supervisor s ON a.supervisor_id = s.id INNER JOIN auxiliar ax ON a.auxiliar_id = ax.id INNER JOIN departamento d ON a.departamento_id = d.id inner join topico t on a.id = t.idAval WHERE a.departamento_id = ? and date(a.data) between ? and last_day(?)"; $stmt = $this->conn->prepare($query); $info["aval"] = array(); $stmt->bindParam(1, $this->departamento); $stmt->bindParam(2, $this->data); $stmt->bindParam(3, $this->data); $stmt->execute(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { extract($row); $info2 = ['name' => $auxiliar, 'y' => $media, 'drilldown' => $auxiliar, 'data' => [['assiduidade', floatval($assiduidade)], ['normas', floatval($normas)], ['eficiencia', floatval($eficiencia)], ['relacionamento', floatval($relacionamento)], ['iniciativa', floatval($iniciativa)], ['visao', floatval($visao)]]]; array_push($info, $info2); } //var_dump($info); $fp = fopen('data.json', "w"); fwrite($fp, json_encode($info, JSON_PRETTY_PRINT)); fclose($fp); } 

this is the output of data.json:

{ "aval": [ ], "0": { "name": "Isratshawatt Sousa", "y": "7.83", "drilldown": "Isratshawatt Sousa", "data": [ [ "assiduidade", 8 ], [ "normas", 7 ], [ "eficiencia", 8 ], [ "relacionamento", 9 ], [ "iniciativa", 6 ], [ "visao", 9 ] ] }, "1": { "name": "Jo\u00e3o Batista J\u00fanior", "y": "7.85", "drilldown": "Jo\u00e3o Batista J\u00fanior", "data": [ [ "assiduidade", 9.8 ], [ "normas", 7.5 ], [ "eficiencia", 8.8 ], [ "relacionamento", 6.6 ], [ "iniciativa", 5.5 ], [ "visao", 8.9 ] ] } } 

And this is the format I need:

{ "aval": [ { "name": "Isratshawatt Sousa", "y": "7.83", "drilldown": "Isratshawatt Sousa", "data": [ [ "assiduidade", 8 ], [ "normas", 7 ], [ "eficiencia", 8 ], [ "relacionamento", 9 ], [ "iniciativa", 6 ], [ "visao", 9 ] ] }, { "name": "Jo\u00e3o Batista J\u00fanior", "y": "7.85", "drilldown": "Jo\u00e3o Batista J\u00fanior", "data": [ [ "assiduidade", 9.8 ], [ "normas", 7.5 ], [ "eficiencia", 8.8 ], [ "relacionamento", 6.6 ], [ "iniciativa", 5.5 ], [ "visao", 8.9 ] } ] } 

My question is how can I format the $info array to reproduce the json format above?

2
  • If you ever get the urge to use extract fight against it until the MADNESS passes This would do the same thing $info2[] = $row; if you had names the columns using as the way you want them in your JSON Commented Apr 16, 2016 at 16:56
  • I think I understand you, the point is that I need that JSON format to be able to generate graphs. Commented Apr 16, 2016 at 17:21

1 Answer 1

2

You are using array_push with wrong array. If you want to add items to "aval", you can change you code like this:

public function json() { $query = "SELECT ax.nome as auxiliar, t.assiduidade, t.normas, t.eficiencia, t.relacionamento, t.iniciativa, t.visao, ( SELECT truncate(avg(t.assiduidade + t.normas + t.eficiencia + t.relacionamento + t.iniciativa + t.visao)/6, 2) FROM topico t WHERE a.id = t.idAval ) AS media FROM avaliacao a INNER JOIN supervisor s ON a.supervisor_id = s.id INNER JOIN auxiliar ax ON a.auxiliar_id = ax.id INNER JOIN departamento d ON a.departamento_id = d.id inner join topico t on a.id = t.idAval WHERE a.departamento_id = ? and date(a.data) between ? and last_day(?)"; $stmt = $this->conn->prepare($query); $info["aval"] = array(); $stmt->bindParam(1, $this->departamento); $stmt->bindParam(2, $this->data); $stmt->bindParam(3, $this->data); $stmt->execute(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { extract($row); $info2 = ['name' => $auxiliar, 'y' => $media, 'drilldown' => $auxiliar, 'data' => [['assiduidade', floatval($assiduidade)], ['normas', floatval($normas)], ['eficiencia', floatval($eficiencia)], ['relacionamento', floatval($relacionamento)], ['iniciativa', floatval($iniciativa)], ['visao', floatval($visao)]]]; $info["aval"][] = $info2; } $fp = fopen('data.json', "w"); fwrite($fp, json_encode($info, JSON_PRETTY_PRINT)); fclose($fp); } 

Note the line

$info["aval"][] = $info2; 

Also, using array[] instead of array_push is a little bit faster, because there is no function call performed.

Sign up to request clarification or add additional context in comments.

2 Comments

Perfect! it seems that I do not need to initialize the array as well ? $info["aval"] = array();
It depends of your app logic. If you haven't initialize array and for some reason query will return zero rows, then you will have result JSON like {"aval": null} Possibly it's better to have empty array in this case: {"aval": []}.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.