看板 PHP 關於我們 聯絡資訊
※ 引述《eco100 (Maktub)》之銘言: : 我的問題是這樣的 : 我有兩個table如下 : table1: table2: : no. start_1 end_1 name start_2 end_2 : 1 3 5 A 1 6 : 2 4 6 B 7 10 : 3 11 13 C 11 15 : 4 12 14 我的作法也很單純,在數線上行走,同時篩出 tbl1 / tbl2 裡相對應的數據 底下是虛擬碼,請視需要實做 主要是透過對 start 排序,一次讀入多筆 table1 的資料,取出不重疊的部份 // 底下兩個 iterator 除了各有 name start, end 的屬性以外, // 還可以用 .next() 跳成下一筆,並且用 .end() 驗證是否迭代完畢 // t1i 為 table1 之 iterator $t1i = $table1.OrderBy('start_1') ; // t2i 為 table2 之 iterator $t2i = $table2.OrderBy('start_2') ; // 計算 t1 目前空槽,如果有負數的話記得把初始值改掉 // 下一個區域不用儲存,因為 Start 就是 $t1i.start $CurrentZoneStart = 0 ; $CurrentZoneEnd = 0; // 迭代直到其中一個跑完 while (!($t1i.end() || $t2i.end())) { // 第一部份,累進 $t1i 直到空槽 $CurrentZoneStart= $t1i.start ; $CurrentZoneEnd = $t1i.end ; $t1i.next() ; while($t1i.start < $CurrentZoneEnd) { $CurrentZoneEnd = max($CurrentZoneEnd, $t1i.end) ; $t1i.next() ; } // 第二部份,找出在目前空槽 ($CurrentZoneEnd, $t1i.start) 內的 t2 while ($t2i.start < $t1i.start) { // 下個洞再檢查 if (($t2i.start > $CurrentZoneEnd) && ($t2i.end < $t1i.start)) { echo $t2i.name ."\n" ; } else $t2i.next() ; } } // 耶,寫完了耶,打錯字不負責 -- 鬼壓床怎麼辦 騎上去啊 Blog: http://clifflu.blogspot.com/ Since March, 2007 Photo Galelry: http://www.picasaweb.com/clifflu 沒有了 T_T -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.230.190