function range_array_unique($outage_times)
{
    foreach ($outage_times as $key => $value) {
        foreach ($outage_times as $i => $v) {
            if ($i >= $key) {
                break;
            }
            if ($value[0] >= $outage_times[$i][0] && $value[0] <= $outage_times[$i][1]) {
                //起始點已重複
                if ($value[1] > $outage_times[$i][1]) {
                    //結束點未重複
                    $outage_times[$i][1] = $value[1];
                    unset($outage_times[$key]);
                    return range_array_unique($outage_times);
                } else {
                    //結束點亦重複
                    unset($outage_times[$key]);
                }
            } else {
                if ($value[1] >= $outage_times[$i][0] && $value[1] <= $outage_times[$i][1]) {
                    //結束點已重複
                    if ($value[0] < $outage_times[$i][0]) {
                        //起始點未重複
                        $outage_times[$i][0] = $value[0];
                        unset($outage_times[$key]);
                        return range_array_unique($outage_times);
                    } else {
                        //起始點亦重複
                        unset($outage_times[$key]);
                    }
                }
            }
        }
    }
    return $outage_times;
}
 /**
  * 更新總使用時數與到期日
  * 
  * @return
  */
 public function update($user_ID, $facility_ID)
 {
     //先找尋上下關係的儀器
     $facility_IDs = $this->facility_model->get_vertical_group_facilities($facility_ID, array("facility_only" => TRUE, "no_child" => TRUE));
     //再尋找水平關係
     $facility_IDs = array_merge($facility_IDs, $this->facility_model->get_horizontal_group_facilities($facility_ID));
     //UNIQUE
     $facility_IDs = array_unique($facility_IDs);
     foreach ($facility_IDs as $facility_ID) {
         //取得此儀器權限
         $privileges = $this->facility_model->get_user_privilege_list(array("user_ID" => $user_ID, "facility_ID" => $facility_ID))->result_array();
         foreach ($privileges as $privilege) {
             $temp_facility_IDs = $this->facility_model->get_vertical_group_facilities($privilege['facility_ID'], array("facility_only" => TRUE));
             $temp_facility_IDs = array_merge($temp_facility_IDs, $this->facility_model->get_horizontal_group_facilities($privilege['facility_ID']));
             //(先取得過往的預約紀錄,找出最近一次的預約紀錄,加上延展時間)
             $old_booking = $this->facility_model->get_facility_booking_list(array("user_ID" => $privilege['user_ID'], "facility_ID" => $temp_facility_IDs))->row_array();
             if (!$old_booking) {
                 $old_booking['end_time'] = $privilege['verification_time'];
             }
             //尋找停機記錄
             $outage_total_time = 0;
             do {
                 //漸進式尋找真正到期日
                 $old_expiration_date = date("Y-m-d H:i:s", strtotime($old_booking['end_time']) + $privilege['extension_sec'] + $outage_total_time);
                 $outages = $this->facility_model->get_outage_list(array("facility_SN" => $temp_facility_IDs, "outage_start_time" => $old_booking['end_time'], "outage_end_time" => $old_expiration_date))->result_array();
                 $outage_times = array();
                 foreach ($outages as $outage) {
                     if (empty($outage['outage_end_time'])) {
                         continue;
                     }
                     $outage_times[] = array(strtotime($outage['outage_start_time']), strtotime($outage['outage_end_time']));
                 }
                 $outage_times = range_array_unique($outage_times);
                 $outage_total_time = 0;
                 foreach ($outage_times as $o_time) {
                     $outage_total_time += $o_time[1] - $o_time[0];
                 }
                 $expiration_date = date("Y-m-d H:i:s", strtotime($old_booking['end_time']) + $privilege['extension_sec'] + $outage_total_time);
             } while ($old_expiration_date != $expiration_date);
             //(最後更新資料)
             $this->facility_model->update_user_privilege(array("serial_no" => $privilege['serial_no'], "expiration_date" => $privilege['privilege'] == 'super' || $privilege['privilege'] == 'admin' || empty($privilege['extension_sec']) ? NULL : $expiration_date, "total_secs_used" => $this->get_total_secs_used($privilege['user_ID'], $privilege['facility_ID'])));
         }
     }
 }