我正在尝试使用PhpPresentation以PowerPoint作为数据源,用PHP中的图表来生成PowerPoint演示文稿。
我可以独立地使两个进程(1.使用手动定义的数据数组生成pptx,2.用中的数据在JavaScript中生成一个数组)。但是,我无法成功地组合这两个进程(传递JavaScript的数组并在PHP中使用它,而不是手动定义的数组)。
1.使用php中手动定义的数组生成pptx
如果我使用以下数组作为数据源(如PhpPresentation文档中定义的),则生成的PowerPoint没有问题:
$series2Data = array('20151201' => 266.1, '20151202' => 198.5, '20151203' => 271.8);2.使用Google 生成一个数组
使用JavaScript生成的字符串数组是:
[{"date":"20151201","avgSessionDuration":266.1},{"date":"20151202","avgSessionDuration":198.5},{"date":"20151203","avgSessionDuration":271.8}]我将这个数组传递给生成我的PowerPoint的php:
<form method="post" id="theform" action="Sample_05_Chart.php">
<input type="hidden" id="markers" name="markers">
<button>Submit</button>
</form>
<script>
window.onload = function() {
var form = document.getElementById('theform');
form.addEventListener('submit', function(){
var markersField = document.getElementById('markers');
var markers = data2;
markersField.value = JSON.stringify(markers);
});
}
</script>在PHP文件中,我添加了:
$markers = json_decode($_POST['markers']);
$series2Data = $markers;但是,生成的PowerPoint已经损坏,因为我认为数组结构不是PhpPresentation所期望的。
然而,我的数组在PHP方面的知识不如在JavaScript中的那么好。
我如何转换一个数组,它的var_dump看起来像
array(3) { [0]=> object(stdClass)#4 (2) { ["date"]=> string(8) "20151201" ["avgSessionDuration"]=> float(266.1) } [1]=> object(stdClass)#9 (2) { ["date"]=> string(8) "20151202" ["avgSessionDuration"]=> float(198.5) } [2]=> object(stdClass)#10 (2) { ["date"]=> string(8) "20151203" ["avgSessionDuration"]=> float(271.8) } }如第1点所描述的那样变成数组?
发布于 2015-12-11 22:29:59
首先,json_decode采用可选的第二个参数。首先,您希望解码的json字符串和第二个布尔值,它告诉它是作为对象数组(stdClass)还是作为关联数组进行解码。
如果您希望发布数据的关联数组,只需使用json_decode($markers, true)即可。
但是,您所要求的格式将不会由此提供。因此,您需要在javascript或php中对一些数据进行按摩。
下面是用来转换它的php代码:
$series2Data = [];
$markers = json_decode($_POST['markers'], true);
foreach ($markers as $marker) {
$series2Data[$marker['date']] = $marker['avgSessionDuration'];
}Javascript:
function formatMarkersToData(markers) {
var series2Data = {};
for (var i = 0; i < markers.length; i++) {
var marker = markers[i];
series2Data[marker.date] = marker.avgSessionDuration;
}
return series2Data;
}
markersField.value = JSON.stringify(
formatMarkersToData(markers)
);这两个代码块所做的是对数据进行循环,并根据date => avgSessionDuration变量中所需的series2data格式设置索引和值。javascript使用对象允许手动设置键。
然后,上面的javascript代码将允许您只使用json_decode($_POST['markers'], true);为您的$series2Data获取适当的关联数组。否则,您将需要PHP代码在将其传递给PhpPresentation之前执行传递。
这取决于您希望在什么时候转换数据--在服务器上,还是在客户机上。如果这有点让人困惑,请告诉我。
https://stackoverflow.com/questions/34233010
复制相似问题