使用PHP从SQL查询创建JSON
我正在尝试以以下格式输出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":
[{
"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-这很有魅力