Объединить массив часов в дружественную строку - PullRequest
0 голосов
/ 23 мая 2011

У кого-нибудь есть ярлыки на это:

У меня есть массив часов, скажем что-то вроде этого:

$hours = array(4,5,6,9,10,14);

Я хочу преобразовать это в красивую строку, в этом родеформата:

$ret = '4am-7am; 9am-11am; 2pm-3pm';

Это массив часов на 24-часовых часах.4 в массиве представляет 0400 часов (4 утра).14 - 1400 часов (2 часа дня).Я ожидаю, что остальные говорят сами за себя.Есть несколько перерывов, поэтому 7AM и 8AM не включены в массив.Поскольку это часы часов, они включают задний фронт включительно ... так как задано 6 утра, то есть весь час 6 утра, который заканчивается в 6:59 утра.С точки зрения пользователя это действительно означает 7 утра.Я могу нарисовать картинку, если это поможет

У кого-нибудь есть удобные ярлыки?:)

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Хорошо, не очень красиво, но вот решение, которое я придумала: рад слышать, если у кого-то есть более чистое решение. :)

function formatHour($hour){
    $pNormalizedHour = $hour % 12;
    $pNormalizedHour = ($pNormalizedHour == 0) ? 12 : $pNormalizedHour;
    return  $pNormalizedHour.($hour < 12 ? 'am' : 'pm');
}
function timeArrToFriendly($hours){
   // cache this, since we'll be asking for it potentially dozens of times.
   $pArrCount = count($hours);
   $retVal = '';
   for ($i=0; $i < $pArrCount; $i++)
   {
       $retVal .= ($retVal == '') ? '' : '; ';
       $retVal .= formatHour($hours[$i]);
       if (($i >= $pArrCount-1) || (($hours[$i + 1]) != ($hours[$i] + 1))){
          $retVal .= '-'.formatHour($hours[$i] + 1);
          continue;         
       }
       for ($j = $i+1; $j < $pArrCount; $j++){
           if (($j >= $pArrCount-1) || ($hours[$j + 1] != $hours[$j] + 1)){
               $retVal .= '-'.formatHour($hours[$j] +1);
               $i = $j;
               break;
           }
       }
   }
   return $retVal;
}
// test string.  Correct output:
//  => 4am-7am; 9am-11am; 12pm-1pm; 2pm-3pm; 6pm-10pm
$hours = array(4,5,6,9,10,12,14,18,19,20,21);
echo timeArrToFriendly($hours);
1 голос
/ 23 мая 2011

Это сработает. Всего около 4 строк. Я не думаю, что вы можете сделать каждый намного проще из-за "я", "вечера" и% 12

<?php
$hours = array(4,5,6,9,10,14);
$time = "";
for($i=0, $j=1; $i<count($hours); $i+=2, $j+=2){        
    $suffix1 = $hours[$i] <12?"am":"pm";   
    $suffix2 = $hours[$j] <12?"am":"pm";
    $time .= $hours[$i].$suffix1."-".($hours[$j]%12).$suffix2."; ";   
}
print $time."\n";
?> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...