Php 将工作日列表转换为时间间隔

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

我正在寻找一个函数,如果连续3天或更多天相继出现,则从一系列工作日中删除一周中的几天。这是我的测试代码(使用测试框架)

带有
的示例为()。函数可以接受任何顺序的工作日

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

我知道有这样的方法。我有点不安,因为我找不到它。我知道有这样的方法。我找不到它,有点心烦。