Php 有效地分离阵列

Php 有效地分离阵列,php,arrays,Php,Arrays,我正在做一个关于数字数组的噩梦,它的结构如下: 数组中的奇数:numberresenting Week 数组中的偶数:number表示时间 例如,在数组中: index : value 0 : 9 1 : 1 2 : 10 3 : 1 将意味着第1天(星期一)的9+10 问题是,我有一个不可预测的数字,我需要计算出每天有多少“会议”。一个会话的规则是,如果他们在不同的一天,他们将自动成为不同的会话。如果它们彼此相邻,如示例9+10中所示,则可算作单个会话。可直接相邻的最大数量为3。在此之后,需

我正在做一个关于数字数组的噩梦,它的结构如下:

数组中的奇数:numberresenting Week
数组中的偶数:number表示时间

例如,在数组中:

index : value
0 : 9
1 : 1
2 : 10
3 : 1
将意味着第1天(星期一)的9+10

问题是,我有一个不可预测的数字,我需要计算出每天有多少“会议”。一个会话的规则是,如果他们在不同的一天,他们将自动成为不同的会话。如果它们彼此相邻,如示例9+10中所示,则可算作单个会话。可直接相邻的最大数量为3。在此之后,需要至少有1次会话中断才能算作新会话

不幸的是,我们也不能假设数据会被排序。它将始终遵循偶数/奇数模式,但可能不会在阵列中逻辑上将会话存储在彼此相邻的位置

我需要计算出有多少节课

到目前为止,我的代码如下:

for($i = 0; $i < (count($TimesReq)-1); $i++){
    $Done = false;
    if($odd = $i % 2 )
    {
    //ODD WeekComp
        if(($TimesReq[$i] != $TimesReq[$i + 2])&&($TimesReq[$i + 2] != $TimesReq[$i + 4])){
        $WeeksNotSame = true;
        }
    }
    else
        {
        //Even TimeComp

        if(($TimesReq[$i] != ($TimesReq[$i + 2] - 1))&& ($TimesReq[$i + 2] != ($TimesReq[$i + 4] - 1)))
        $TimesNotSame = true; 
        }
    if($TimesNotSame == true && $Done == false){
    $HowMany++; 
    $Done = true;
    }
    if($WeeksNotSame == true && $Done == false){
    $HowMany++;
    $Done = true; 
    }
$TimesNotSame = false;
$WeeksNotSame = false;
    }
for($i=0;$i<(count($TimesReq)-1);$i++){
$Done=false;
如果($odd=$i%2)
{
//奇数周公司
如果($TimesReq[$i]!=$TimesReq[$i+2])&($TimesReq[$i+2]!=$TimesReq[$i+4])){
$WeeksNotSame=true;
}
}
其他的
{
//偶数时间补偿
如果($TimesReq[$i]!=($TimesReq[$i+2]-1))&($TimesReq[$i+2]!=($TimesReq[$i+4]-1)))
$TimesNotSame=true;
}
如果($TimesNotSame==true&&$Done==false){
$HowMany++;
$Done=true;
}
如果($WeeksNotSame==true&&$Done==false){
$HowMany++;
$Done=true;
}
$TimesNotSame=false;
$WeeksNotSame=false;
}
然而,这并不完美。例如,如果您有一个单独的会话,然后是一个中断,然后是一个双会话,则它不起作用。它将此视为一次会议

这可能正如你所猜测的,是一个课业问题,但这不是教科书上的问题,它是我正在实施的时间表系统的一部分,是让它工作所必需的。所以请不要以为我只是抄袭和粘贴我的家庭作业给你们

非常感谢你

正在使用的新代码:

if (count($TimesReq) % 2 !== 0) {
//throw new InvalidArgumentException();
}

for ($i = 0; $i < count($TimesReq); $i += 2) {

    $time = $TimesReq[$i];
    $week = $TimesReq[$i + 1];

    if (!isset($TimesReq[$i - 2])) {
        // First element has to be a new session
        $sessions += 1;
                $StartTime[] = $TimesReq[$i];
                $Days[] = $TimesReq[$i + 1];
        continue;
    }

    $lastTime = $TimesReq[$i - 2];
    $lastWeek = $TimesReq[$i - 1];

    $sameWeek = ($week === $lastWeek);
    $adjacentTime = ($time - $lastTime === 1);
    if (!$sameWeek || ($sameWeek && !$adjacentTime)) {

    if(!$sameWeek){//Time
    $Days[] = $TimesReq[$i + 1];
            $StartTime[] = $TimesReq[$i];
            $looking = true;
    }
    if($sameWeek && !$adjacentTime){
    }
    if($looking && !$adjacentTime){
        $EndTime[] = $TimesReq[$i];
        $looking = false;           
    }
//Week      

        $sessions += 1;
    }
}
if(计数($TimesReq)%2!==0){
//抛出新的InvalidArgumentException();
}
对于($i=0;$i
如果希望在数据中表示单个会话总数,其中每个会话由一个空格分隔(非连续时间或单独的一天)。我认为此函数将获得您的结果:

function countSessions($data)
{
    if (count($data) % 2 !== 0) throw new InvalidArgumentException();

    $sessions = 0;
    for ($i = 0; $i < count($data); $i += 2) {
        $time = $data[$i];
        $week = $data[$i + 1];

        if (!isset($data[$i - 2])) {
            // First element has to be a new session
            $sessions += 1;
            continue;
        }

        $lastTime = $data[$i - 2];
        $lastWeek = $data[$i - 1];

        $sameWeek = ($week === $lastWeek);
        $adjacentTime = ($time - $lastTime === 1);
        if (!$sameWeek || ($sameWeek && !$adjacentTime)) {
            $sessions += 1;
        }
    }

    return $sessions;
}

$totalSessions = countSessions(array(
    9, 1,
    10, 1,
));
函数countSessions($data)
{
如果(计数($data)%2!==0)抛出新的InvalidArgumentException();
$sessions=0;
对于($i=0;$i
当然,这假设数据已排序。如果不是,则需要首先对其进行排序。这里是一个替代实现,包括对未排序数据的支持

function countSessions($data)
{
    if (count($data) % 2 !== 0) throw new InvalidArgumentException();

    $slots = array();
    foreach ($data as $i => $value) {
        if ($i % 2 === 0) $slots[$i / 2]['time'] = $value;
        else $slots[$i / 2]['week'] = $value;
    }

    usort($slots, function($a, $b) {
        if ($a['week'] == $b['week']) {
            if ($a['time'] == $b['time']) return 0;
            return ($a['time'] < $b['time']) ? -1 : 1;
        } else {
            return ($a['week'] < $b['week']) ? -1 : 1;
        }
    });

    $sessions = 0;
    for ($i = 0; $i < count($slots); $i++) {
        if (!isset($slots[$i - 1])) { // First element has to be a new session
            $sessions += 1;
            continue;
        }

        $sameWeek = ($slots[$i - 1]['week'] === $slots[$i]['week']);
        $adjacentTime = ($slots[$i]['time'] - $slots[$i - 1]['time'] === 1);
        if (!$sameWeek || ($sameWeek && !$adjacentTime)) {
            $sessions += 1;
        }
    }

    return $sessions;
}
函数countSessions($data)
{
如果(计数($data)%2!==0)抛出新的InvalidArgumentException();
$slots=array();
foreach($i=>$value形式的数据){
如果($i%2==0)$slots[$i/2]['time']=$value;
else$slots[$i/2]['week']=$value;
}
usort($slots,function($a,$b){
如果($a['week']=$b['week']){
如果($a['time']=$b['time'])返回0;
回报($a['time']<$b['time'])?-1:1;
}否则{
报税表($a['周]<$b['周])?-1:1;
}
});
$sessions=0;
对于($i=0;$i
如果希望在数据中表示单个会话总数,其中每个会话由一个空格分隔(非连续时间或单独的一天)。我认为此函数将获得您的结果:

function countSessions($data)
{
    if (count($data) % 2 !== 0) throw new InvalidArgumentException();

    $sessions = 0;
    for ($i = 0; $i < count($data); $i += 2) {
        $time = $data[$i];
        $week = $data[$i + 1];

        if (!isset($data[$i - 2])) {
            // First element has to be a new session
            $sessions += 1;
            continue;
        }

        $lastTime = $data[$i - 2];
        $lastWeek = $data[$i - 1];

        $sameWeek = ($week === $lastWeek);
        $adjacentTime = ($time - $lastTime === 1);
        if (!$sameWeek || ($sameWeek && !$adjacentTime)) {
            $sessions += 1;
        }
    }

    return $sessions;
}

$totalSessions = countSessions(array(
    9, 1,
    10, 1,
));
函数countSessions($data)
{
如果(计数($data)%2!==0)抛出新的InvalidArgumentException();
$sessions=0;
对于($i=0;$iWeek 4 has 4 session(s):
    Session 1:
        Start Time: 8
        End Time: 10
    Session 2:
        Start Time: 11
        End Time: 14
    Session 3:
        Start Time: 16
        End Time: 19
    Session 4:
        Start Time: 20
        End Time: 21
Week 2 has 1 session(s):
    Session 1:
        Start Time: 7
        End Time: 8