Php 将工作日列表转换为时间间隔
我正在寻找一个函数,如果连续3天或更多天相继出现,则从一系列工作日中删除一周中的几天。这是我的测试代码(使用测试框架) 带有Php 将工作日列表转换为时间间隔,php,arrays,dayofweek,Php,Arrays,Dayofweek,我正在寻找一个函数,如果连续3天或更多天相继出现,则从一系列工作日中删除一周中的几天。这是我的测试代码(使用测试框架) 带有的示例为()。函数可以接受任何顺序的工作日 <?php function drop_days($string, $atleast = 3) { $weekdays = 'Mo,Tu,We,Th,Fr,Sa,Su'; $weekdays = explode(',', $weekdays); $selected = array(); $se
的示例为()。函数可以接受任何顺序的工作日
<?php
function drop_days($string, $atleast = 3) {
$weekdays = 'Mo,Tu,We,Th,Fr,Sa,Su';
$weekdays = explode(',', $weekdays);
$selected = array();
$sequences = array();
foreach ($weekdays as $weekday)
$selected[] = (strpos($string,$weekday)!==false);
$i = 0;
while ($i<count($weekdays)) {
if (!$selected[$i]) {
$i++;
continue;
}
if ($i+$atleast<=count($weekdays)) {
for ($j=$i+1; $j<count($weekdays); $j++) {
if ($selected[$j]) {
if ($j+1<count($weekdays)) continue;
$sequences[] = $weekdays[$i] . '-' . $weekdays[$j];
break 2;
} else {
if ($j-$i>=$atleast)
$sequences[] = $weekdays[$i] . '-' . $weekdays[$j-1];
else
for ($k=$i; $k<$j; $k++) $sequences[] = $weekdays[$k];
$i = $j+1;
break;
}
}
} else {
$sequences[] = $weekdays[$i];
$i++;
}
}
return implode(',', $sequences);
}
?>
带有is()
at的示例。函数可以接受任何顺序的工作日
<?php
function drop_days($string, $atleast = 3) {
$weekdays = 'Mo,Tu,We,Th,Fr,Sa,Su';
$weekdays = explode(',', $weekdays);
$selected = array();
$sequences = array();
foreach ($weekdays as $weekday)
$selected[] = (strpos($string,$weekday)!==false);
$i = 0;
while ($i<count($weekdays)) {
if (!$selected[$i]) {
$i++;
continue;
}
if ($i+$atleast<=count($weekdays)) {
for ($j=$i+1; $j<count($weekdays); $j++) {
if ($selected[$j]) {
if ($j+1<count($weekdays)) continue;
$sequences[] = $weekdays[$i] . '-' . $weekdays[$j];
break 2;
} else {
if ($j-$i>=$atleast)
$sequences[] = $weekdays[$i] . '-' . $weekdays[$j-1];
else
for ($k=$i; $k<$j; $k++) $sequences[] = $weekdays[$k];
$i = $j+1;
break;
}
}
} else {
$sequences[] = $weekdays[$i];
$i++;
}
}
return implode(',', $sequences);
}
?>
另一种方法:
function drop_days( $str, $days = 'mo,tu,we,th,fr,sa,su' ) {
$days_i_s = array_flip( explode( ',', $days ) );
$days_i_n = explode( ',', $days );
$day_string = str_replace( array_keys( $days_i_s ), array_values( $days_i_s ), strtolower( $str ) );
return str_replace( array_values( $days_i_s ), array_keys( $days_i_s ), preg_replace_callback( '~(0,1,2,3,4,5,6)|(1,2,3,4,5,6)|(0,1,2,3,4,5)|(1,2,3,4,5)|(2,3,4,5,6)|(0,1,2,3,4)|(0,1,2,3)|(0,1,2)|(3,4,5,6)|(2,3,4,5)|(2,3,4)|(3,4,5)|(1,2,3,4)|(1,2,3)|(2,3,4)|(4,5,6)~', function($m) use($days_i_n){return $days_i_n[$m[0][0]].'-'.$days_i_n[$m[0][strlen($m[0])-1]] ;}, $day_string ) );
}
echo drop_days( "Mo,Tu,We,Fr,Sa,Su" );
另一种方法:
function drop_days( $str, $days = 'mo,tu,we,th,fr,sa,su' ) {
$days_i_s = array_flip( explode( ',', $days ) );
$days_i_n = explode( ',', $days );
$day_string = str_replace( array_keys( $days_i_s ), array_values( $days_i_s ), strtolower( $str ) );
return str_replace( array_values( $days_i_s ), array_keys( $days_i_s ), preg_replace_callback( '~(0,1,2,3,4,5,6)|(1,2,3,4,5,6)|(0,1,2,3,4,5)|(1,2,3,4,5)|(2,3,4,5,6)|(0,1,2,3,4)|(0,1,2,3)|(0,1,2)|(3,4,5,6)|(2,3,4,5)|(2,3,4)|(3,4,5)|(1,2,3,4)|(1,2,3)|(2,3,4)|(4,5,6)~', function($m) use($days_i_n){return $days_i_n[$m[0][0]].'-'.$days_i_n[$m[0][strlen($m[0])-1]] ;}, $day_string ) );
}
echo drop_days( "Mo,Tu,We,Fr,Sa,Su" );
有时“愚蠢”的方法是最聪明的
function drop_days($s) {
static $map = array(
'Mo,Tu,We,Th,Fr,Sa,Su' => 'Mo-Su',
'Mo,Tu,We,Th,Fr,Sa' => 'Mo-Sa',
'Mo,Tu,We,Th,Fr' => 'Mo-Fr',
'Mo,Tu,We,Th' => 'Mo-Th',
'Mo,Tu,We' => 'Mo-We',
'Tu,We,Th,Fr,Sa,Su' => 'Tu-Su',
'Tu,We,Th,Fr,Sa' => 'Tu-Sa',
'Tu,We,Th,Fr' => 'Tu-Fr',
'Tu,We,Th' => 'Tu-Th',
'We,Th,Fr,Sa,Su' => 'We-Su',
'We,Th,Fr,Sa' => 'We-Sa',
'We,Th,Fr' => 'We-Fr',
'Th,Fr,Sa,Su' => 'Th-Su',
'Th,Fr,Sa' => 'Th-Sa',
'Fr,Sa,Su' => 'Fr-Su',
);
return strtr($s, $map);
}
有时“愚蠢”的方法是最聪明的
function drop_days($s) {
static $map = array(
'Mo,Tu,We,Th,Fr,Sa,Su' => 'Mo-Su',
'Mo,Tu,We,Th,Fr,Sa' => 'Mo-Sa',
'Mo,Tu,We,Th,Fr' => 'Mo-Fr',
'Mo,Tu,We,Th' => 'Mo-Th',
'Mo,Tu,We' => 'Mo-We',
'Tu,We,Th,Fr,Sa,Su' => 'Tu-Su',
'Tu,We,Th,Fr,Sa' => 'Tu-Sa',
'Tu,We,Th,Fr' => 'Tu-Fr',
'Tu,We,Th' => 'Tu-Th',
'We,Th,Fr,Sa,Su' => 'We-Su',
'We,Th,Fr,Sa' => 'We-Sa',
'We,Th,Fr' => 'We-Fr',
'Th,Fr,Sa,Su' => 'Th-Su',
'Th,Fr,Sa' => 'Th-Sa',
'Fr,Sa,Su' => 'Fr-Su',
);
return strtr($s, $map);
}
我知道有这样的方法。我有点不安,因为我找不到它。我知道有这样的方法。我找不到它,有点心烦。