我正在創建某種顯示特定日期事件的日曆/議程。每個事件在垂直小時網格中顯示爲HTML元素。可能同時存在多個(「碰撞」)事件,在這些情況下,這些元素應該水平放置並排放置,並且具有相同的寬度。例如。四個碰撞事件的列值爲4,這樣的寬度爲25%。放置彼此相鄰的碰撞元素
棘手的部分是這些碰撞事件。我以爲我解決了它,但一些元素得到錯誤的列數。
可能有更好的方法來計算列數和位置 - 我願意接受建議。當前(錯誤的)結果
樣品圖片:
相關代碼:
<?php
class Calendar {
const ROW_HEIGHT = 24;
public $events = array();
public $blocks = array();
public function calculate_blocks() {
foreach($this->events as $event) {
// Calculate the correct height and vertical placement
$top = $this->time_to_pixels($event->_event_start_time);
$bottom = $this->time_to_pixels($event->_event_end_time);
$height = $bottom - $top;
// Abort if there's no height
if(!$height) continue;
$this->blocks[] = array(
'id' => $event->ID,
'columns' => 1,
'placement' => 0, // Column order, 0 = first
'css' => array(
'top' => $top,
'bottom' => $bottom, // bottom = top + height
'height' => $height
)
);
}
$done = array();
// Compare all the blocks with each other
foreach($this->blocks as &$block) {
foreach($this->blocks as &$sub) {
// Only compare two blocks once, and never compare a block with itself
if($block['id'] == $sub['id'] || (isset($done[$block['id']]) && in_array($sub['id'], $done[$block['id']])) || (isset($done[$sub['id']]) && in_array($block['id'], $done[$sub['id']]))) continue;
$done[$block['id']][] = $sub['id'];
// If the blocks are colliding
if(($sub['css']['top'] >= $block['css']['top'] && $sub['css']['top'] < $block['css']['bottom'])
|| ($sub['css']['bottom'] >= $block['css']['top'] && $sub['css']['bottom'] < $block['css']['bottom'])
|| ($sub['css']['top'] <= $block['css']['top'] && $sub['css']['bottom'] >= $block['css']['bottom'])) {
// Increase both blocks' columns and sub-block's placement
$sub['columns'] = ++$block['columns'];
$sub['placement']++;
}
}
}
}
private function time_to_int($time) {
// H:i:s (24-hour format)
$hms = explode(':', $time);
return ($hms[0] + ($hms[1]/60) + ($hms[2]/3600));
}
private function time_to_pixels($time) {
$block = $this->time_to_int($time);
return (int)round($block * self::ROW_HEIGHT * 2);
}
}
?>
我不認爲這是要在PHP中解決的問題。這是[一個不錯的JavaScript小部件](http://dhtmlx.com/docs/products/dhtmlxScheduler/)。 – Alternatex 2014-10-07 12:40:52
在這種特殊情況下,應該在服務器級完成。不管怎樣,謝謝你。 – Ivar 2014-10-07 13:05:48
當您使用$ this-> blocks製作這些嵌套的foreach時,不會將遊標設置爲不同的位置嗎?也許你應該檢查一下。 – SenseException 2014-10-07 13:44:37