PHPで曜日の連結について考えてみました

曜日を扱う際の面倒臭さ…

DB内に保存されて日付データを連結するというプログラムが必要になったので、考えてみました。

扱うデータは以下の感じ。

0,1,2,3,6 // 日,月,火,水,土

取得する関数は以下のようにしました。

// 曜日名取得関数
function get_day_names($ids) {
  $day_name = array(日,月,火,水,木,金,土);
  if( @$ids ) {
    $data = array();
    foreach($ids as $key => $val) {
      foreach($day_name as $day_key => $day_val) {
        if($day_key == $val){
          $data = $day_val;
        }
      }
    }
    return $data;
  }
  return false;
}

// 曜日連結関数
function get_days( $day ) {
  $_explode = explode(",", $day);
  if ( count($_explode) == 1 ) {
    $_explode = $this->get_day_names($_explode);
    return $_explode;
  }
  $temp_s = $_explode[0];
  $data = array();
  for( $i = 0; $i < count($_explode); $i++ ) {
    if( $i == 0 ) {
      $temp = $temp_s;
      continue;
    }
    if( $temp+1 == $_explode[$i]) {
      $temp = $_explode[$i];
    } else {
      $temp_end = $_explode[$i-1];
      if($temp_s == $temp_end) {
        $sequence = array($temp_s);
        $data = join(" ",$this->get_day_names($sequence));
      } else {
        $sequence = array($temp_s,$temp_end);
        $data = join("〜",$this->get_day_names($sequence));
      }
      $temp = $_explode[$i];
      $temp_s = $_explode[$i];
    }
    if( $i == (count($_explode)-1) ) {
      $end_day = $_explode[$i];
      if($temp_s == $end_day) {
        $sequence = array($temp_s);
        $data = join(" ",$this->get_day_names($sequence));
      } else {
        $sequence = array($temp_s,$end_day);
        $data[] = join("〜",$this->get_day_names($sequence));
      }
    }
  }
  return $data;
}

これで、get_daysに上述のデータを送ると、日〜水と土の値がリストで返ってくるようになります。
曜日とか他のことにも応用出来そうです。

コメントを残す