I'm trying to print out an array of dates pulled from an API, which come out formatted as YYYYmmdd, i.e. 20160701. When I convert them to a friendlier format and then go to print them in Highcharts, it actually will do a mathematical calculation based on the operator being used to separate the date elements. Obviously that's not what I want it to do. So the first date is actually performing 7 minus 1 minus 2016, resulting in the -2010. Does anyone know what is causing this?
PHP Snippet
foreach ($arr['rows'] as $item){
$dates[] = DateTime::createFromFormat('Ymd', $item[0])->format('m-d- Y');
}
Javascript Highchart Plugin
$('#myChart').highcharts({
xAxis: {
categories: [
<?php
echo implode(',', $dates);
?>
]
},
What the dates end up looking like:
The problem is that you're not injecting any quotes in the Javascript source.
What you get is something like:
$('#myChart').highcharts({
xAxis: {
categories: [ 7-1-2016 ] // <--- should be [ "7-1-2016" ]
}
});
which is evaluated as categories: [ -2010 ]
on the Javascript side.
You should do:
$('#myChart').highcharts({
xAxis: {
categories: [
<?php
echo '"'.implode('","', $dates).'"';
?>
]
}
});
Or if you prefer to have this fixed in the PHP code that is building this array:
foreach ($arr['rows'] as $item){
$dates[] = DateTime::createFromFormat('Ymd', $item[0])->format('"m-d-Y"');
}
EDIT: as suggested by jlbriggs, a better approach would be to use json_encode()
.
At least on $dates
...
$('#myChart').highcharts({
xAxis: {
categories: <?php echo json_encode($dates); ?>
}
});
... or on the whole object passed to highcharts()
(assuming it's entirely built on the PHP side):
$('#myChart').highcharts(<?php echo json_encode($highChartsObject); ?>);