七个标志,以简明的一周的天数列表?

时间:2013-03-15 06:08:00

标签: php

我有一个7个标志的数组/字符串/整数,一个星期的每一天(一个重复的事件)。如何将其转换为简短的日期列表?

所以,例如

Given 1011001, return 'Su, T-W, Sa'.
Given 0111011, return 'M-W, F-Sa'.

实现这一目标的最短途径是什么?

修改

为了比较,这是我自己的不雅代码:

<?php
function dowstring($dow) {
  if ($dow == 0) return "Error";
  $ddow = ["Su", "M", "T", "W", "Th", "F", "Sa"];
  $t = strrev( sprintf('%07b', $dow) );
  $u = str_split($t);
  $out = '';
  $cu = count($u);
  $nn = 0; // number of days thus far counted
  $v = 0; // number in the run
  for($i = 0; $i < $cu; $i++) {
      if ($u[$i]) {
        if ($v == 0) {
          $out .= ($nn) ? ", " : '';
          $out .= $ddow[$i];
        }
      $nn++;
      $v++;
      }
      else {
        if ($v > 1) {
            $out .= ($nn) ? "-" . $ddow[$i-1] : '';
        }
      $v = 0;
      }
  }
  // in case Saturday is part of a run
  if ($v > 1) {
      $out .= ($nn) ? "-" . $ddow[$i-1] : '';
  }
  return $out;
}

echo "<pre>";

// testing script
for ($i = 1; $i < pow(2, 7); $i++) {
    $ds = dowstring($i);
    $j = strrev( sprintf("%07b", $i) );
    printf("%s %s\n", $j, $ds);
}

echo "</pre>";
?>

修改

另一次尝试,受到Prasanth的启发:

function dowstring($dow) {
  if ($dow == 0) return "Error";
  $ddow = ["Su", "M", "T", "W", "Th", "F", "Sa"];
  $t = strrev( sprintf('%07b', $dow) );
  $v = array_keys( array_filter( str_split($t) ) );
  $cv = count($v); $w = array();
  $out = $ddow[$v[0]];
  for ($i = 1; $i < $cv; $i++) $w[] = $v[$i] - $v[$i - 1] - 1;   
  $w = ( $cv == 1 ) ? array($w) : $w;
  for ($i = 1; $i < $cv; $i++) {
    if (!$w[$i - 1]) $last = $ddow[$v[$i]];
    else {
      if ( isset($last) ) $out .= '-' . $last; 
      $out .= ', ' . $ddow[$v[$i]];
      unset($last);
    }
  }
  if ($i > 1 && !$w[$i-2] ) $out .= '-' . $ddow[ $v[$i-1] ];

  return $out;
}

我希望看到更好的东西。任何人吗?

2 个答案:

答案 0 :(得分:2)

试试这个:

$days=array('1'=>'Monday','2'=>'Tuesay','3'=>'Wednesday','4'=>'Thursday','5'=>'Friday','6'=>'Saturday','7'=>'Sunday');
$pattern = '1000110';
$arr1 = str_split($pattern);
$i=0;
foreach($days as $key => $tes) { 
  if($key - $arr1[$i] != $key) {
    echo $tes;
  }
  $i++;
}

根据您想要的天数来调整天数数组

答案 1 :(得分:1)

试试这个:

<?php
$days = array('Su','M','T','W','Th','F','Sa');
function checkConsec($d) {
    for($i=0;$i<count($d);$i++) {
        if(isset($d[$i+1]) && $d[$i]+1 != $d[$i+1]) {
            return false;
        }
    }
    return true;
}

$str  = '0111011';
$array  = array_keys(array_filter(str_split($str)));

$temp     = array();
$res      = array();
for($i=0;$i<count($array);$i++){
    $temp[]  = $array[$i];
    if(checkConsec($temp) && count($temp) > 1){
       $res[$temp[0]] = $days[$temp[0]]."-".$days[$temp[count($temp)-1]];
    }else{
       $res[$array[$i]] = $days[$array[$i]];
       $temp     = array();
       $temp[]  = $array[$i];
    }
}
echo implode(",",$res);

?>