2015-12-11 6 views
0

Я пытаюсь использовать PhpPresentation для динамического создания презентаций PowerPoint с диаграммами на PHP с использованием Google Analytics в качестве источника данных.Пропустить JavaScript-массив для PhpPresentation

Я могу сделать оба процесса самостоятельно (1. генерация pptx с использованием массива данных, определенного вручную, и 2. генерация массива в JavaScript с данными из Google Analytics Core Reporting API). Однако я не могу успешно объединить оба процесса (передать массив JavaScript и использовать его в PHP вместо моего вручную определенного массива).

1. генерации PPTX, используя определенный вручную массив в PHP

Если я использую следующий массив в качестве источника данных (как определено в PhpPresentation документации), то PowerPoint, генерируется без проблем:

$series2Data = array('20151201' => 266.1, '20151202' => 198.5, '20151203' => 271.8); 

2. генерировать массив с данными из Google Analytics Core Reporting API

строковой массив генерируется с JavaScript является:

[{"date":"20151201","avgSessionDuration":266.1},{"date":"20151202","avgSessionDuration":198.5},{"date":"20151203","avgSessionDuration":271.8}] 

Я передаю этот массив в PHP, который генерирует мой PowerPoint:

<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?

ответ

2

Прежде всего, 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.

Это зависит от того, в какой момент вы хотите преобразовать данные - на сервере или на клиенте. Если это вообще смущает, сообщите мне.

+0

Совсем не смущает! Вы прекрасно это объяснили. Это кажется действительно разумным, но я не смог найти подходящее решение во всей документации, которую я прочитал о массивах в php. Конечно, это потому, что я не использовал подходящие ключевые слова для поиска. Я наконец массировал массив в php и сейчас работает! – agustin