串联小时阵列成一个友好的字符串

问题描述:

任何人有任何的快捷方式是:串联小时阵列成一个友好的字符串

我有一个小时的阵列,说是这样的:

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

我想将其转换成一个漂亮的字符串,采用这种格式:

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

这是24小时制时钟的数组。阵列中的4表示0400小时(凌晨4点)。 14是1400小时(下午2点)。我希望其余的都是自我解释。有多个中断,所以7AM和8AM不包含在阵列中。因为这些是时钟时间,所以这些是包含后端的...自从6AM被指定,包括6AM的整个小时,其在上午6:59结束。从用户角度来看,这确实意味着7AM。如果有帮助,我可以绘制一张图片

任何人都有任何方便的捷径? :)

+0

目前还不清楚如何形成'4 am-7am'这样的间隔。 '上午7点'从哪里来的? – 2011-05-23 06:10:41

+0

问题不明确。 – 2011-05-23 06:11:42

+0

这些是时钟。想象一下,从这样的角度来看,它确实是早上6点59分。对我而言,'早上7点'是最有意义的。 – 2011-05-23 06:12:09

好,不是很漂亮做到每个要容易得多,但这里是我想出了解决办法:很高兴听到如果有人有更清洁的解决方案。 :)

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); 
+0

祝你好运Mr.Green。 – Bastardo 2011-05-23 07:29:17

这将工作一种享受。只有大约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"; 
?> 
+0

这输出4 am-5am; 6 am-9am; 10 am-2pm; – 2011-05-23 06:23:08

+0

看起来很棒。甚至没有意识到你能做到这一点。但是,它有错误的答案。应该是:'上午4点到上午7点; 9 am-11am; 2 pm-3pm';我认为它需要做一个休息检测。 – 2011-05-23 06:31:19

+0

我终于看到你在做什么... OPS,这不是一个很好问的问题,grrrr .... – 2011-05-23 11:58:22