2016-04-16 14 views
0

データベーステーブルから情報を取得して配列に格納する関数を作ったので、json固有の形式でエンコードする必要があります。 これは、関数である:PHP配列json形式

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); 
} 

これは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 
      ] 
     ] 
    } } 

そして、これは私が必要なフォーマットである:私の質問はどのように私はできている

{ 
    "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 
      ] 
     } 
     ] 
    } 

上記のjson形式を再現する$ info配列をフォーマットしますか?

+0

もしあなたがMADNESSが通過するまで 'extract' **との戦いをしようと思ったら**これは同じ名前' $ info2 [] = $ row; 'を実行します。 'あなたがあなたのJSONでそれらをしたい方法 – RiggsFolly

+0

私はあなたを理解していると思う、ポイントは私はグラフを生成することができるJSON形式が必要です。 – kelsen

答えて

2

array_pushの配列が間違っています。あなたが「アバール」の項目を追加したい場合は、このようにあなたのコードを変更することができます。

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); 
} 

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

またラインを、配列[]の代わりにarray_pushの使用は少し速くなります実行された関数呼び出しがないためです。

+0

パーフェクト!それは私も配列を初期化する必要はないようだ? '$ info [" aval "] = array();' – kelsen

+0

あなたのアプリケーションのロジックに依存します。配列を初期化せずに何らかの理由でクエリがゼロの行を返す場合は、 '{" aval ":null}'のような結果JSONが返されます。この場合空の配列を持つ方がいいでしょう。 '{" aval " []} '。 – Andrew

関連する問題