Autor Zpráva
MONTYCEK
Profil
Zdravím, jakým způsobem by se dalo nejlépe ošetřit zadaný čas, tak aby výsledek byl například 16:00, 17:30, 15:12 i v případě, že do formuláře bude zadáno 16.00, nebo 16.
juriad
Profil
Třeba takto:
function parseTime($input) {
  $parts = preg_split('/[^0-9]/', $input, -1, PREG_SPLIT_NO_EMPTY);
  $numbers = array();
  foreach ($parts as $index => $part) {
    $numbers[] = ((int) $part) % ($index == 0 ? 24 : 60);
  }
  $numbers[] = 0;
  $numbers[] = 0;
  # leave out the emphasized zero if you like it more that way 
  return sprintf("%02d:%02d", $numbers[0], $numbers[1]);
}

foreach (array('16', '', '16.52', '7:0', 'sdc', '10 : 67', '4:5:6') as $in) {
  echo parseTime($in), "\n";
}
Opraveno maximum hodin.
MONTYCEK
Profil
juriad:
Díky vyzkouším
Jan Tvrdík
Profil
juriad:
Poslední tři řádky té funkce jsou zjednodušit na
return vsprintf("%02d:%02d", $numbers + [0, 0]);
Alphard
Profil
I tak mi to přijde jako zbytečně magický workaround. Proč tam ty nuly nedát hned při inicializaci?
$numbers = [0, 0];
foreach ($parts as $index => $part) {
  $numbers[$index] = ((int) $part) % ($index == 0 ? 24 : 60);
}
juriad
Profil
Hm, obě možnosti jsou zajímavé a o něco kratší.
Ještě je možné (nikoli doproručené) 7. a 8. řádek odstranit a ten sprintf ozavináčovat (znalí vědí).

Alphard:
Protože jsem tam původně ten $index jako klíč ve foreach neměl a přidal jsem jej později pro to modulo. A v ten okamžik jsem už přidání na konec pole měl hotové.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: