使用php将JSON字符串重新格式化为morris图表格式

时间:2016-03-11 18:18:13

标签: php json csv

将远程csv文件转换为JSON后,我有以下json

将csv的代码转换为json

/////////////////////////////////////////////////////////
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, '');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: Token ****',
    'Accept-Version: ***',
));
$data = curl_exec($ch);
///////////////////////////////////////////////////////////////



if (curl_errno($ch)) {
print "Error: " . curl_error($ch);
} else {
// Show me the result
//var_dump($data);
curl_close($ch);
$array = array_map("str_getcsv", explode("\n", $data));
$encode = json_encode($array, true);

///////////////////////////////////////

它产生了这个:

[
"Timestamp",
"Point",
"Value",
"2016-03-11T14:40:00+00:00",
"ategho-leg_1-8",
"487.0",
"2016-03-11T14:40:00+00:00",
"ategho-leg_2-8",
"488.0",
"2016-03-11T14:40:00+00:00",
"ategho-leg_3-8",
"484.0",
"2016-03-11T14:40:00+00:00",
"ategho-temperature_long-8",
"466.0",
"2016-03-11T14:40:00+00:00",
"ategho-temperature_short-8",
"198.0",
"2016-03-11T14:45:00+00:00",
"ategho-leg_1-8",
"482.0",
"2016-03-11T14:45:00+00:00",
"ategho-leg_2-8",
"490.0",
"2016-03-11T14:45:00+00:00",
"ategho-leg_3-8",
"479.0",
"2016-03-11T14:45:00+00:00",
"ategho-temperature_long-8",
"464.0",
"2016-03-11T14:45:00+00:00",
"ategho-temperature_short-8",
"199.0",
null

我想把它变成数据用于morris图表,它想要这种格式的数据:

[
{"Timestamp":"2016-03-11T14:40:00+00:00", "Point":"ategho-leg_1-8", "Value":"487.0"}
]

我已经搜索了堆栈并尝试过数字的东西,但我无法让它切换格式。我也试过这样的东西:

$new_final = array();
foreach($array as $value) {
    foreach($value as $sub_value) {
        $new_final[] = $sub_value;
    }
}

echo json_encode($new_final);

感谢任何帮助。感谢

EDIt:第一个答案给了我这样的代码:

{
  "Timestamp":[
     "2016-03-11T14:40:00+00:00",
     "ategho-leg_3-8",
     "484.0"
  ],
  "Point":[
     "2016-03-11T14:40:00+00:00",
     "ategho-temperature_long-8",
     "466.0"
  ],
  "Value":[
     "2016-03-11T14:40:00+00:00",
     "ategho-temperature_short-8",
     "198.0"
  ]
  },

1 个答案:

答案 0 :(得分:1)

最好的方法是直接处理来自csv的数据,而无需在JSON中进行预编码。 顺便说一句,这将有效:

$data = json_decode( $json );

$result = array();
for( $i = 3; $i< count( $data ); $i=$i+3 )
{
    $result[] = array
    (
        'Timestamp' => $data[$i],
        'Point'     => $data[$i+1],
        'Value'     => $data[$i+2]
    );
}

echo json_encode( $result );

eval.in demo

基本上,你需要一个从第3项开始并且重复每3项的for()`循环,然后你可以使用 morris chart 格式向主数组添加一个关联数组。

在您的示例中,上一个JSON项目为Null,因此在转换为JSON之前,您必须确定unset()unset()的最后一个元素是$result

编辑:

通过修改后的问题,您可以通过以下方式处理数组:

$result = array();
for( $i = 1; $i < count( $array ); $i++ )
{
    $result[] = array
    (
        'Timestamp' => $array[$i][0],
        'Point'     => $array[$i][1],
        'Value'     => $array[$i][2]
    );
}
echo json_encode( $result );

如果Null问题仍然存在,请在之前检查

请注意 for()循环从1开始以避免包含标头。如果你没有头,你必须从0开始循环。