Aide pour créer un script

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2024, 19:27

Merci two3d :D

Après relecture de ma logique je me suis dis mais c'est pas exactement ce que j'ai fait, pourquoi faire simple quand on peut faire compliqué ? Alors voilà la fonction simplifiée et qui suit véritablement la logique énoncée.
function getDayAssaults(string $dayDate = '2024-02-22'): array
{
    $referenceTime = (new DateTime('2024-02-21T18:00'))->getTimestamp();
    $assaultDelayTime = 19 * 60 * 60;

    $startRatio = (
        (new DateTime($dayDate . 'T00:00'))->getTimestamp() - $referenceTime
        ) / $assaultDelayTime;
    $endRatio = (
        (new DateTime($dayDate . 'T23:59'))->getTimestamp() - $referenceTime
        ) / $assaultDelayTime;

    $dayAssaults = [];
    for (
        $i = is_int($startRatio) ? $startRatio : ceil($startRatio);
        $i <= floor($endRatio);
        $i++
    ) {
        $dayAssaults[] = (new DateTime())->setTimestamp($i * $assaultDelayTime + $referenceTime);
    }

    return $dayAssaults;
}
Au final on boucle sur chaque entier compris entre les ratios de début et fin de journée et on a qu'à calculer le timestamp correspondant à l'entier en le multipliant par le nombres de secondes dans 19h et en y ajoutant le timestamp de la date de référence.
Modifié en dernier par Saian le 22 févr. 2024, 20:47, modifié 7 fois.
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1564 Messages

22 févr. 2024, 19:30

Te faut pas un espace avant les heures
((new DateTime($dayDate . '00:00')) //et 23:59 ? Comme ' 00:00'

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2024, 19:34

Je dirais que c'est mieux mais ça fonctionne sans. ^^
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1564 Messages

22 févr. 2024, 21:02

Le T pour l'ISO correct, bien vu =D>

Avatar du membre
Mammouth du PHP | 1609 Messages

23 févr. 2024, 02:08

Oué j'ai nettoyé un peu le code et enlevé les variables inutiles et j'ai modifié ça au passage, rapport à ta remarque. ^^

Au final 8 instructions suffisent à résoudre la problématique et le code me semble assez lisible et compréhensible.
Développeur web depuis + de 20 ans

Avatar du membre
Foo
Petit nouveau ! | 7 Messages

23 févr. 2024, 08:23

Je ne voulais pas un travail tout fait, dommage car je voulais le faire par moi même.

M'enfin. C'est ce que je souhaitais. Donc grand merci pour ton aide, c'est modifié et intégré =)

Avatar du membre
Mammouth du PHP | 1609 Messages

23 févr. 2024, 14:29

Désolé c'était trop tentant d'essayer et le "je souhaite juste une direction" m'a un peu échappé.

T'en étais où ? avais tu pensé à utiliser un assaut référence et les timestamp ? Si t'as compris la logique qu'a été la mienne c'est l'essentiel, bien que j'avoue c'est chouette de concrétiser par du code. Du coup je te remercie aussi car ça m'a bien diverti. ^^

Sinon "dernière" petite retouche, un DateTime en paramètre, je trouve ça quand même plus cohérent et y a pas d'histoire de sous quelle forme faut passer la date, c'est un DateTime point.
function getDayAssaults(DateTime $dayDate): array
{
    $referenceTime = (new DateTime('2024-02-21T18:00'))->getTimestamp();
    $assaultDelayTime = 19 * 60 * 60;

    $startRatio = (
        (new DateTime($dayDate->format('Y-m-dT00:00')))->getTimestamp() - $referenceTime
        ) / $assaultDelayTime;
    $endRatio = (
        (new DateTime($dayDate->format('Y-m-dT23:59')))->getTimestamp() - $referenceTime
        ) / $assaultDelayTime;

    $dayAssaults = [];
    for (
        $i = is_int($startRatio) ? $startRatio : ceil($startRatio);
        $i <= floor($endRatio);
        $i++
    ) {
        $dayAssaults[] = (new DateTime())->setTimestamp($i * $assaultDelayTime + $referenceTime);
    }

    return $dayAssaults;
}
On est dans la quintessence du code, simplicité, lisibilité, pas de fioriture. Comment ça j'ai le melon ?! 8-)
Développeur web depuis + de 20 ans