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