生成的格式是:200908010001 前面幾位為當前的日期,後面五位為系統自增長類型的編號原理:
1.獲取當前日期格式化值
2.讀取文件,上次編號的值+1最為當前此次編號的值(記錄以文件的形式存儲,下月會接著這個編號)
<?php
class FileEveryDaySerialNumber 
{
 private $filename;    //檔名
 private $separate;    //系統分隔符號
 private $width;       //自動增長部分的個數
 public function __construct($width, $filename, $separate) 
 {
  $this->width = $width;
  $this->filename = $filename;
  $this->separate = $separate;
 }
 public function getOrUpdateNumber($current, $start) 
 {
  $record = IOUtil::read_content($this->filename);
  $arr = explode($this->separate, $record);
  if($current == $arr[0])
  { 
   //如果是同一天,則繼續增長
   $arr[1]++;
   IOUtil::write_content("$arr[0],$arr[1]", $this->filename); //將新值存入文件中
   return "$arr[0]".str_pad($arr[1],$this->width,0,STR_PAD_LEFT);
  }
  else
  { 
   //如果兩個日期不一樣則重新從起始值開始
   $arr[0] = $current;
   $arr[1] = $start;
   IOUtil::write_content("$arr[0],$arr[1]", $this->filename); //將新值存入文件中
   return "$arr[0]".str_pad($arr[1],$this->width,0,STR_PAD_LEFT);
  }
 }
}
class IOUtil
{
 public static function read_content($filename)
 {
  $handle = fopen($filename,"r");
  $content = fread($handle,filesize($filename));
  return $content;
 }
 public static function write_content($content, $filename)
 {
  $handle = fopen($filename,"w");
  fseek($handle,0);
  fwrite($handle, $content);
  return $content;
 }
}
?>
參數含義分別是日期後自增長數的位數, 存儲的文件名稱, 日期與自增長數的分割數注意:網站目錄下需有EveryDaySerialNumber.dat否則會發生錯誤
使用範例(一)
 $obj = new FileEveryDaySerialNumber(4,"EveryDaySerialNumber.dat",",");   
 $current_date = date("Ymd");
 echo $obj->getOrUpdateNumber($current_date,1);
輸出結果:
201207230001
使用範例(二)
 $obj = new FileEveryDaySerialNumber(3,"EveryDaySerialNumber.dat",",");   
 $current_date = date("ym");
 echo $obj->getOrUpdateNumber($current_date,1);
輸出結果:
1207001
 
沒有留言:
張貼留言