Calcolare i tempi di permanenza in un webinar di Gotowebinar

Durante l’integrazione api spesso capita di dover adattare i risultati ottenuti alla logica del nostro programma.

In questo caso, ecco una funzione per calcolare il tempo reale che un attendee ha passato nel webinar utilizzando i dati che arrivano da una chiamata alle api di GoToWebinar:


L’array che arriva dalla chiamata api

$dates = array(
	0 => array(
		'st' => '09:50',
		'et' => '10:05'
	),
	1 => array(
		'st' => '10:40',
		'et' => '11:20'
	),
	2 => array(
		'st' => '10:07',
		'et' => '10:45'
	),
	3 => array(
		'st' => '10:00',
		'et' => '10:03'
	),
);

Classi e funzioni

function pre($s){
	echo '
';
	print_r($s);
	echo '

‘;
}

function date_to_timestamp($date){
$d = DateTime::createFromFormat('H:i', $date);
if ($d === false) {
die("Incorrect date string");
} else {
return $d->getTimestamp();
}
}

function timestamp_to_date($time){
$hours = floor($time / 60 );

return $hours;
}

class Period
{
var $start = 0;
var $end = 0;
var $total = array();

function begin(){
$this->total[] = array(
'st' => $this->start,
'et' => $this->end
);
}

function extend(){
$i = count($this->total);
$this->total[$i-1]['et'] = $this->end;
}
}

Il ciclo

 

pre($dates);

$realstart = date_to_timestamp('09:00');
pre($realstart);
$realend = date_to_timestamp('10:00');
pre($realend);
pre('Convert to timestamp');
$i = 0;
foreach($dates as $date){
pre($date);
$dates[$i]['st'] = date_to_timestamp($date['st']);
$dates[$i]['et'] = date_to_timestamp($date['et']);
$i++;
}

pre($dates);
pre('Set Right Start and End');
$i = 0;
foreach($dates as $date){
if($dates[$i]['st'] < $realstart) $dates[$i]['st'] = $realstart; if($dates[$i]['et'] > $realend) $dates[$i]['et'] = $realend;
$i++;
}

$i = 0;
foreach($dates as $date){
$dates[$i]['st'] = $dates[$i]['st'] - $realstart;
$dates[$i]['et'] = $dates[$i]['et'] - $realstart;

$i++;
}

/*usort($dates, function($a, $b) {
return $a['st'] <=> $b['st'];
});
*/
usort($dates, function($a, $b) {
$retval = $a['st'] <=> $b['st'];
if ($retval == 0) {
$retval = $a['et'] <=> $b['et'];
}
return $retval;
});

pre($dates);
pre('-------------------------------------------');
$total_webinar_time = $realend - $realstart;
pre('total_webinar_time :'.$total_webinar_time);
$p = new Period;
for($i=0;$i<count($dates);$i++){ pre('-------->i: '.$i);
if(isset($dates[$i-1])){
// dal secondo record in poi
if($dates[$i]['st'] > $dates[$i-1]['et']){
// l'inizio di questo record è maggiore dell'inizio del precedente
// crea nuovo period
$p->start = $dates[$i]['st'];
$p->end = $dates[$i]['et'];
$p->begin();
pre($p->total);
} else {
// l'inizio di questo record NON è maggiore dell'inizio del precedente
// incrementa period
if(($dates[$i]['et']-$dates[$i]['st']) == $total_webinar_time) {
die('100%');
} else {
$p->end = $dates[$i]['et'];
$p->extend();
pre($p->total);
}
}
} else {
//primo record trattato
if(($dates[$i]['et']-$dates[$i]['st']) == $total_webinar_time) {
die('100% cirulli');
} else {
$p->start = $dates[$i]['st'];
$p->end = $dates[$i]['et'];
$p->begin();
pre($p->total);
}
}
}

pre('calculate time');
$total_sum = 0 ;
foreach($p->total as $p){
pre($p);
$sum = $p['et'] - $p['st'];
if($sum > 0) $total_sum = $total_sum + $sum ;
}