使用PHP从SQL查询创建JSON

使用PHP从SQL查询创建JSON,php,json,Php,Json,我正在尝试以以下格式输出JSON: [{ "category": "cONTIME", "value": 155, "color": "#0f9b0f" },{ "category": "cLATE", "value": 244, "color": "#dd1818" },{ "category": "cTOTAL", "value": 399, "color": "#0575E6" },{ "category": "ONTIME", "value":

我正在尝试以以下格式输出JSON:

[{
  "category": "cONTIME",
  "value": 155,
  "color": "#0f9b0f"
},{
  "category": "cLATE",
  "value": 244,
  "color": "#dd1818"
},{
  "category": "cTOTAL",
  "value": 399,
  "color": "#0575E6"
},{
  "category": "ONTIME",
  "value": 60,
  "color": "#0f9b0f"
},{
  "category": "LATE",
  "value": 58,
  "color": "#dd1818"
},{
  "category": "TOTAL",
  "value": 118,
  "color": "#0f9b0f"
}]
我正在执行的存储过程返回下表-这是SQL SERVER-我已将不感兴趣的列显示为灰色

我已尝试使用

$categories = [
    'cONTIME' => $row['cONTIME'],
    'cLATE' => [],
    'cTOTAL' => [],
];
$colors = [
    'ONTIME' => "#0f9b0f",
    'LATE' => "#dd1818",
    'TOTAL' => "#0575E6",
];

$json = array();

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
        $json['category'] = $categories;
        $json['value'] = $row;
        $json['color'] = $colors;
}
echo json_encode($json);
退回此邮件:

{
   "category":{
      "cONTIME":null,
      "cLATE":[

      ],
      "cTOTAL":[

      ]
   },
   "value":{
      "cTOTAL":399,
      "cONTIME":155,
      "cLATE":244,
      "cPERCENTS":38,
      "TOTAL":118,
      "ONTIME":60,
      "LATE":58,
      "PERCENTS":50,
      "KPI":"UP"
   },
   "color":{
      "ONTIME":"#0f9b0f",
      "LATE":"#dd1818",
      "TOTAL":"#0575E6"
   }
}
我也尝试过这样做:

$json = array();

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {          
        $json[] = $row;
}
echo json_encode($json);
返回:

[
   {
      "cTOTAL":399,
      "cONTIME":155,
      "cLATE":244,
      "cPERCENTS":38,
      "TOTAL":118,
      "ONTIME":60,
      "LATE":58,
      "PERCENTS":50,
      "KPI":"UP"
   }
]
除上述方法外,我还尝试了许多其他方法和示例,但似乎无法达到我需要的格式。我完全了解PDO、准备好的报表、注射剂等!,我只需要先格式化JSON,但提前感谢您的建议


任何帮助都将不胜感激-PHP Noob

类似的东西应该可以工作:

$json = array();

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {          
    foreach ($row as $fieldName => $fieldValue) {
        if (in_array($fieldName, ['cTOTAL', 'cONTIME', 'cLATE', 'TOTAL' ,'ONTIME', 'LATE'])) {
            $json[] = [
                "category" => $fieldName,
                "value" => $fieldValue,
                "color" => getColorByFieldName($fieldName),
            ];
        }
    }
}
echo json_encode($json);

function getColorByFieldName($fieldName) 
{
    if ($fieldName === 'ONTIME' || $fieldName === 'cONTIME') {
        return '#0f9b0f';
    }
    if ($fieldName === 'LATE' || $fieldName === 'cLATE') {
        return '#dd1818';
    }
    if ($fieldName === 'TOTAL' || $fieldName === 'cTOTAL') {
        return '#0575E6';
    }
}

所以颜色是硬编码的列表/数组?列名应该成为你的类别吗?那么你从数据库中得到的只是这一行?然后,您不希望循环结果集中的记录(无需循环任何内容,总“迭代计数”为1),而是希望循环这一条记录的列作为开始。在定义
$row
-数组之前,不能使用
'cONTIME'=>$row['cONTIME'],
。这将始终为您提供
null
(以及错误日志中关于未定义变量的警告)。@PatrickQ Yeah-这些颜色是硬代码您缺少中间颜色前面的
:-)soz-正在使用应用程序-cheers@u mulder-这很有魅力