1

(定期的なイベントの) 曜日ごとに 1 つずつ、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>";
?>

編集

プラサントに触発された別の試み:

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;
}

もっといいものを見たいです。誰?

4

2 に答える 2

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++;
}

必要な日の順序に従って日配列を調整します

于 2013-03-15T06:50:26.220 に答える
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);

?>
于 2013-03-15T06:27:12.560 に答える