Je vais avoir un cauchemar asbolute face à un tableau de nombres qui a la structure suivante:Ventiler une gamme efficace
Les nombres impairs dans le tableau: NumberRepresenting Semaine
Même numéros dans le tableau: NumberRepresenting temps
Ainsi, par exemple dans le tableau:
index : value
0 : 9
1 : 1
2 : 10
3 : 1
Signifiera 9 + 10 le jour 1 (lundi). Le problème est, j'ai un nombre imprévisible de ceux-ci et je dois déterminer combien de "sessions" il y a par jour. Les règles d'une session sont que si elles sont un autre jour, elles sont automatiquement différentes. Si elles sont côte à côte comme dans l'exemple 9 + 10 cela compterait comme une seule session. Le nombre maximal pouvant être directement l'un à côté de l'autre est de 3. Après cela, il doit y avoir un minimum d'une pause entre deux sessions pour compter comme une nouvelle session.
Malheureusement, nous ne pouvons pas supposer que les données seront triées. Il suivra toujours le modèle pair/impair MAIS ne pourrait pas avoir des sessions stockées côte à côte logiquement dans le tableau.
Je dois déterminer combien de sessions il y a.
Mon code à ce jour est le suivant:
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;
}
Cependant, cela ne fonctionne pas parfaitement. par exemple, cela ne fonctionne pas si vous avez une seule session, puis une pause, puis une double session. Cela compte comme une session. Ceci est, probablement comme vous l'avez deviné, un problème de cours, mais ce n'est pas une question d'un manuel, il fait partie d'un système de planification que je suis en train de mettre en œuvre et est nécessaire pour le faire fonctionner. Alors s'il te plait ne pense pas que je suis juste en train de copier et coller mes devoirs à vous les gars!
Merci beaucoup!
Nouveau code utilisé:
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;
}
}
Qu'est-ce qui est censé se produire lorsque les données donnent 4 semaines d'affilée? Est-ce que cela devrait être reconnu comme 2 sessions, ou le code devrait-il reconnaître que l'exigence (avoir seulement 3 sessions d'affilée) est cassée? – ghbarratt
Une validation préalable signifie que cela ne se produira pas. Désolé aurait dû être plus précis. Le maximum sera 3 d'affilée jusqu'à une pause. – user1096685
Vous indiquez que même les index (0 et 2 dans votre exemple) représentent des semaines, mais que plus tard les 9 + 10 seraient la même session (il n'y a donc qu'une seule session dans votre exemple), mais s'ils sont des semaines ils sont des sessions séparées? (à l'heure = 1 à la semaine 9 et à l'heure = 1 à la semaine 10). Ou suis-je complètement confus? Aussi, vous parlez des jours, mais il n'y a pas de données sur les jours. Les jours/semaines sont-ils utilisés de manière interchangeable? –