diff --git a/application/controllers/Dayswithqso.php b/application/controllers/Dayswithqso.php index 32acd8d9..2f9e9acd 100644 --- a/application/controllers/Dayswithqso.php +++ b/application/controllers/Dayswithqso.php @@ -18,6 +18,7 @@ class Dayswithqso extends CI_Controller { $data['page_title'] = "Number of days with QSOs each year"; $data['result'] = $this->dayswithqso_model->getDaysWithQso(); + $data['streaks'] = $this->dayswithqso_model->getLongestStreak(); $this->load->view('interface_assets/header', $data); $this->load->view('dayswithqso/index'); diff --git a/application/models/Dayswithqso_model.php b/application/models/Dayswithqso_model.php index 3ffe3ac9..4ee0eae3 100644 --- a/application/models/Dayswithqso_model.php +++ b/application/models/Dayswithqso_model.php @@ -15,8 +15,6 @@ class Dayswithqso_model extends CI_Model $CI->load->model('Stations'); $station_id = $CI->Stations->find_active(); - - $sql = "select year(COL_TIME_ON) Year, COUNT(DISTINCT TO_DAYS(COL_TIME_ON)) as Days from " .$this->config->item('table_name'). " thcv where station_id = " . $station_id . " and COL_TIME_ON is not null group by year"; @@ -26,4 +24,69 @@ class Dayswithqso_model extends CI_Model return $query->result(); } + /* + * Function returns the 10 longest streaks of QSOs based on all QSO dates in the log on active station profile + */ + function getLongestStreak() { + $dates = $this->getDates(); + $streak = 1; // A day with a qso will always be a streak + $dateprev = date_create('1900-01-01'); // init variable with an old date + $i = 0; + + foreach($dates as $date) { // Loop through the result set + $datecurr = date_create($date->date); + if ($dateprev == date_create('1900-01-01')) { // If first run + $dateprev = $datecurr; + } + else { + $diff = $dateprev->diff($datecurr)->format("%a"); // Getting date difference between current date and previous date in array + if ($diff == 1) { // If diff = 1, means that we are on a streak + $streak++; + $endstreak = $datecurr; // As long as the streak continues, we update the end date + } else { + if ($streak > 1) { + $streaks[$i]['highstreak'] = $streak; + $streaks[$i]['endstreak'] = $endstreak->format('Y-m-d'); + $streaks[$i]['beginstreak'] = $endstreak->sub(new DateInterval('P'.($streak-1).'D'))->format('Y-m-d'); + $i++; + } + $streak = 1; + } + $dateprev = date_create($date->date); + } + } + + if (isset($streaks) && is_array($streaks)) { + usort($streaks, array($this,'compareStreak')); // Sort array, highest streak first + $streaks_trimmed = array_slice($streaks, 0,10); // We only want top 10, so we trim the array + return $streaks_trimmed; + } else { + return null; + } + } + + /* + * Used for sorting the array highest streak first + */ + function compareStreak($a, $b) { + return strnatcmp($b['highstreak'], $a['highstreak']); + } + + /* + * Returns all distinct dates from db on active profile + */ + function getDates() { + $CI =& get_instance(); + $CI->load->model('Stations'); + $station_id = $CI->Stations->find_active(); + + $sql = "select distinct cast(col_time_on as date) as date from " + .$this->config->item('table_name'). " thcv + where station_id = " . $station_id . " order by date asc"; + + $query = $this->db->query($sql); + + return $query->result(); + } + } \ No newline at end of file diff --git a/application/views/dayswithqso/index.php b/application/views/dayswithqso/index.php index 8f7bc49b..fc905ab8 100644 --- a/application/views/dayswithqso/index.php +++ b/application/views/dayswithqso/index.php @@ -30,4 +30,30 @@ } ?> +

Longest streak with QSOs in the log

+

A maximum of the 10 longest streaks are shown!

+ '; + + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + foreach ($streaks as $streak) { + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + + echo '
Streak (Continues days with QSOs)Begin dateEnd date
' . $streak['highstreak'] . '' . $streak['beginstreak'] . '' . $streak['endstreak'] . '
'; + } + else { + echo ''; + } + ?>