2016-04-16 60 views
0

我做了一个函数从数据库表中检索一些信息并将其存储在数组中,然后我需要使用json特定的格式对其进行编码。 这是函数:PHP Array 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 
      ] 
     } 
     ] 
    } 

我的问题是我怎么能格式化$ info数组来重现上面的json格式?

+0

如果你有过使用'extract' **的冲动,直到MADNESS通过**这会做同样的事情'$ 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

这取决于您的应用逻辑。如果你没有初始化数组,并且由于某种原因,查询将返回零行,那么你将得到结果JSON,如'{“aval”:null}'可能最好在这种情况下有空数组:'{“aval”: []}'。 – Andrew