<?php namespace Xentral\Widgets\Chart; use DateInterval; use DatePeriod; use DateTimeInterface; class PeriodMatcher { /** @var DateTimeInterface $start */ protected $start; /** @var DateTimeInterface $end */ protected $end; /** @var DateInterval $interval */ protected $interval; /** @var string $format */ protected $format; /** @var DatePeriod $range */ protected $range; /** * @param DateTimeInterface $start * @param DateTimeInterface $end * @param DateInterval $interval * @param string $format Formate der PHP date()-Funktion */ public function __construct( DateTimeInterface $start, DateTimeInterface $end, DateInterval $interval, $format = 'Y.m.d' ) { $this->start = $start; $this->end = $end; $this->interval = $interval; $this->format = $format; $this->range = new DatePeriod($start, $interval, $end); } /** * @param array $data * @param string $dateKey * @param string $valueKey * * @return array */ public function matchData($data, $dateKey, $valueKey) { if ($data === null) { $data = []; } $dates = array_column($data, $dateKey); $values = array_column($data, $valueKey); $result = []; foreach ($this->getDates() as $date) { $matchedKey = array_search($date, $dates, true); $result[] = $matchedKey !== false ? (float)$values[$matchedKey] : 0.0; } return $result; } /** * @param string $format Datumsformat überschreiben * * @return array */ public function getDates($format = null) { $result = []; /** @var DateTimeInterface $date */ foreach ($this->range as $date) { $result[] = $date->format($format !== null ? $format : $this->format); } return $result; } }