搜索连续数组值的运行


Searching for Runs of Consecutive Array Values

我正在为计算机服务器开发一个简单的调度程序,需要采用以下数组:

Array 
( 
   [Mon] => false, 
   [Tues] => true, 
   [Wed] => false,
   [Thurs] => true, 
   [Fri] => true,
   [Sat] => true,
   [Sun] => false
)

并得到一个像这样返回的数组:

Array
(
   'Thurs', 'Fri', 'Sat'
)

基本上,我正在寻找数组连续True两次以上的实例。可能是星期一,星期二,星期三,可能是星期五,星期六,星期日,但不可能是星期一,星期三,星期四。

我的第一个想法是提出每一种可能性并将其硬编码为一个数组,然后foreach每种可能性,但这花了太长时间并且感觉很草率。

谢谢

这将返回第一个序列 3,如果不存在这样的序列,则返回一个空数组:

function getDays(array $schedule) {
    $sequence = array();
    foreach($schedule as $day => $value) {
        if($value) {
            $sequence[] = $day;
            // check if we have enough trues to exit
            if(count($sequence) > 2) {
                break;
            }
        }
        else {
            // we found a false, so reset any existing sequence
            $sequence = array();
        }
    }
    return $sequence;
}
$schedule = array( 
       'Mon' => false, 
       'Tues' => true, 
       'Wed' => false,
       'Thurs' => true, 
       'Fri' => true,
       'Sat' => true,
       'Sun' => false
    );
print_r(getDays($schedule));

输出:

Array
(
    [0] => Thurs
    [1] => Fri
    [2] => Sat
)

以下内容应该适用于任意天数

$days = array('Mon' => 'false', 'Tues' => 'true', 
              'Wed' => 'false', 'Thurs' => 'true', 
              'Fri' => 'true', 'Sat' => 'true', 
              'Sun' => 'false');
while ($day = array_shift($days)) {
        if($day == next($days)) {
            $result[] = array_search($day, $days)."<br/>";
        }
} 
print_r($result);

结果:

Array
(
    [0] => Wed
    [1] => Thurs
    [2] => Fri
)

看看它的实际效果!

<?php
$daysTest = array(
     '0-Thurs,Fri,Sat' => array('Mon' => false, 'Tues' => true,'Wed' => false, 'Thurs' => true,'Fri' => true, 'Sat' => true,'Sun' => false)
    ,'1-Thurs,Fri,Sat' => array('Mon' => true,  'Tues' => true,'Wed' => false, 'Thurs' => true,'Fri' => true, 'Sat' => true,'Sun' => false)
    ,'2-Mon,Tues,Wed,Thurs,Fri,Sat,Sun' => array('Mon' => true, 'Tues' => true,'Wed' => true, 'Thurs' => true,'Fri' => true, 'Sat' => true,'Sun' => false)
    ,'3-' => array('Mon' => false, 'Tues' => true,'Wed' => false, 'Thurs' => true,'Fri' => false, 'Sat' => true,'Sun' => true)
);
$minLength = 3;
foreach ($daysTest as $target => $days) {
$result = array();
$stack  = array();
foreach ($days as $key => $match) {
    if ( $match ) {
        $stack[] = $key;
    }
    else {
        if ( $minLength <= count($stack)) {
            $result += $stack;
        }
        $stack  = array();
    }
}
if ( $minLength <= count($stack)) {
    $result += $stack;
}
echo 'Result:',implode(',',$result),"'n";
echo 'Target:',$target,"'n";
}