Lista de eventos com uma lista de carimbos de data / hora, agrupados por hora em uma exibição tabular, em PHP.

Durante a refatoração, estou procurando um algoritmo otimizado para um horário (calendário) em PHP.

Eu tenho uma lista de eventos que têm uma lista de carimbos de data e hora. Isso deve ser apresentado de forma tabular. O código atual funciona, mas tem a) algumas peculiaridades e é b) muito inflexível. Eu estou olhando para refatorar esta peça e procurando informações de maneira otimizada.

Exemplo aqui, observe o cabeçalho da tabela com as horas. E os horários nessa hora sendo agrupados nessa coluna. Um evento, com dois registros de data e hora em uma hora, pode ser ignorado (isso só pode acontecer na teoria, conforme os documentos técnicos)

A tabela é construída com Drupalstheme_table (), que posso construir a partir de qualquer matriz, contendo matrizes para cadalinha. a parte Drupal, no entanto, é de pouco interesse aqui :)

Código atual (trechos):

<?php
//inside function that builds the content for the page linked to above:
$this_morning = _playdates_get_start_of_day_with($timestamp);
$this_night = _playdates_get_end_of_day_with($timestamp);
$nodes = _playdates_load_all_in_range($types, $this_morning, $this_night);
usort($nodes, '_playdates_cmp_titles');
//we now have a list of "nodes", being the events listed in the first column, which have
//  a list of playdates, the timestamps. $node->nid is a unique id for each event.  
foreach ($nodes as $node) {
  $times = $dates = array();
  if (is_array($node->starts_at)) {
    foreach ($node->starts_at as $starts_at) {
      $date = getdate($starts_at);
      $dates[$starts_at] = $date;
      if (!isset($active) && ($timestamp <= ($date[0] + $timezone))) {
        $active = _playdates_get_idx_hour($date);
      }
    }
    $times = _playdates_group_by_hour($dates);
    foreach ($times as $key => $value) {
      $header_times[$key] = $key;
    }
    $header = array_merge($header, $header_times);
    $entries[$node->nid] = $node;
    $entries[$node->nid]->times = $times;
  }
}

function _playdates_group_by_hour($timestamps, $playdate = NULL) {
  $indexes = array();
  foreach ($timestamps as $key => $value) {
    $indexes[_playdates_get_idx_hour($value)] = theme('playdates_format_time', $value, $playdate);
  }
  ksort($indexes);
  return $indexes;
}   

function _playdates_get_idx_hour($date) {
  return playdates_format_date($date[0], 'custom', 'H:00');
}

Portanto, o padrão é: pegue (e ordene) a lista de eventos. Faça um loop sobre isso, para cada evento, faça um loop sobre os carimbos de data e hora e crie uma matriz com a chave sendo a hora do carimbo de data / hora (agrupar por horas).

Existem padrões melhores? Existe uma maneira mais genérica de conseguir isso? Alguma palavra-chave que eu possa pesquisar (não tenho idéia de como esse padrão seria chamado)?

exemplo de conjunto de dados Os nós $ (dados desnecessários removidos) são assim:

array(15) {
  [1]=>
  object(stdClass)#48 (6) {
    ["title"]=> 
    string(19) "Cosa voglio di più"
    ["type"]=>
    string(4) "film"
    ["nid"]=>
    string(4) "2823"
    ["premiere"]=>
    object(stdClass)#49 (1) {
      ["starts_at"]=>
      string(10) "1286550000"
    }
    ["starts_at"]=>
    array(2) {
      [0]=>
      string(10) "1286550000"
      [1]=>
      string(10) "1286559000"
    }
    ["ends_at"]=>
    array(2) {
      [0]=>
      string(1) "0"
      [1]=>
      string(1) "0"
    }
  }
  [12]=>
  object(stdClass)#46 (6) {
    ["title"]=>
    string(5) "Tirza"
    ["type"]=>
    string(4) "film"
    ["nid"]=>
    string(4) "2813"
    ["premiere"]=>
    object(stdClass)#47 (1) {
      ["starts_at"]=>
      string(10) "1286550000"
    }
    ["starts_at"]=>
    array(3) {
      [0]=>
      string(10) "1286550000"
      [1]=>
      string(10) "1286558100"
      [2]=>
      string(10) "1286566200"
    }
    ["ends_at"]=>
    array(3) {
      [0]=>
      string(1) "0"
      [1]=>
      string(1) "0"
      [2]=>
      string(1) "0"
    }
  }
  [14]=>
  object(stdClass)#36 (6) {
    ["title"]=>
    string(47) "Vision - aus dem Leben der Hildegard von Bingen"
    ["type"]=>
    string(4) "film"
    ["nid"]=>
    string(4) "2783"
    ["premiere"]=>
    object(stdClass)#39 (1) {
      ["starts_at"]=>
      string(10) "1286541900"
    }
    ["starts_at"]=>
    array(1) {
      [0]=>
      string(10) "1286541900"
    }
    ["ends_at"]=>
    array(1) {
      [0]=>
      string(1) "0"
    }
  }
}

questionAnswers(2)

yourAnswerToTheQuestion