T: / Corrigés des challenges / PHP
Calculer une durée en PHP selon un format spécifique à partir de secondes.
Dans ce challenge, on dispose d’une liste de frictions rencontrées sur une semaine.
Chaque friction contient une durée perdue en secondes.
L’objectif est de calculer la perte de temps sur une année complète, puis de l’afficher au format : (nbJours)j (nbHeures)h (nbMinutes)min
Au programme :
On commence par parcourir le tableau $frictions.
Chaque élément est une chaîne de caractères contenant deux informations séparées par : : type:durée
Le type de friction n’est pas utile pour le calcul final. On récupère donc surtout la durée, puis on l’ajoute à un total initialisé au départ :
$totalSeconds = 0;
foreach ($frictions as $friction) {
[$type, $duration] = explode(':', $friction);
$totalSeconds += (int) $duration;
}
$annualSeconds = $totalSeconds * 52;
Pour organiser le code proprement, on peut créer une classe Duration.
Son rôle est de recevoir une durée en secondes, puis être capable de calculer les jours, les heures et les minutes correspondantes.
class Duration
{
private const SECONDS_PER_MINUTE = 60;
private const SECONDS_PER_HOUR = 3600;
private const SECONDS_PER_DAY = 86400;
public function __construct(
private int $totalSeconds
) {
}
public function getDays(): int
{
return intdiv($this->totalSeconds, self::SECONDS_PER_DAY);
}
public function getHours(): int
{
$remainingSeconds = $this->totalSeconds % self::SECONDS_PER_DAY;
return intdiv($remainingSeconds, self::SECONDS_PER_HOUR);
}
public function getMinutes(): int
{
$remainingSeconds = $this->totalSeconds % self::SECONDS_PER_HOUR;
return intdiv($remainingSeconds, self::SECONDS_PER_MINUTE);
}
public function format(): string
{
return $this->getDays() . 'j ' . $this->getHours() . 'h ' . $this->getMinutes() . 'min';
}
}
Un peu d’explications :
86400 est correct, mais SECONDS_PER_DAY est beaucoup plus clair à lire.getDays() calcule le nombre de jours complets. intdiv() permet de faire une division entière. Si la durée contient 2 jours complets et quelques heures, on récupère seulement 2.getHours(), on ne veut pas le nombre total d’heures, mais le nombre d’heures restantes après avoir retiré les jours complets. Le modulo % permet de récupérer le reste après les jours complets. Puis on utilise à nouveau intdiv().getMinutes().format() renvoie les données au format attendu par l’énoncé du challenge.$totalSeconds = 0;
foreach ($frictions as $friction) {
[$type, $duration] = explode(':', $friction);
$totalSeconds += (int) $duration;
}
$annualSeconds = $totalSeconds * 52;
$duration = new Duration($annualSeconds);
echo $duration->format();
Ce challenge montre comment transformer une durée brute en secondes en un affichage plus lisible.
La classe Duration permet de regrouper toute la logique de conversion au même endroit : calcul des jours, calcul des heures restantes, calcul des minutes restantes, puis formatage final. Le code principal reste ainsi simple : il additionne les durées, projette le résultat sur 52 semaines, puis délègue l’affichage à la classe.
C’est une bonne première approche de la programmation orientée objet en PHP : une classe reçoit une donnée, la conserve, puis expose des méthodes claires pour l’exploiter. Ici, chaque méthode a un rôle précis, ce qui rend le code plus facile à lire, à tester et à faire évoluer.
Si tu débutes en POO, n’hésite pas à découvrir les challenges STARTER POO.
Other content to discover