2016-06-12 52 views
0

我有一列列出军事时间的数组,我试图找到下一个最接近当前值的数值。例如,当它是上午9:30时,它应该返回上午9:40,因为这是下一个最大的时间,而不管它现在是什么时间,它将在10:00上午返回。不返回我阵列中的下一个最大值

function closest($array, $number) { 
sort($array); 
foreach ($array as $a) { 
    if ($a >= $number) return $a; 
} 
return end($array); 
} 

$array = array(0730,0750,0810,0830,0840,0850,0900,0910,0920,0930,0940,0950,1000,1010,1020,1030,1040,1050,1100,1110,1120,1130,1140,1150,1210,1230,1250,1310,1330,1350,1410,1430,1450,1510,1530,1550,1610,1630,1650,1710,1720,1730,1740,1750,1800,1810,1820,1830,1840,1850,1900,1910,1920,1930,1940,1950,2000,2010,2020,2030,2040,2050,2100,2120,2140,2200,2220,2240,2300,2320); 
$number = date("Hi"); 
$nexttime = closest($array, $number); 

echo date("g:i a", strtotime("$nexttime")); 

我经历过很多次试图诊断问题,试图消除在最初的几次前所有零的返回下午7:00的更奇怪的结果。

+0

用'0'前缀数字告诉php将其解释为八进制。 –

+1

您是否尝试使用print_r进行排序后输出数组? – bksi

+0

它似乎总是返回结束($ array) – bksi

回答

0

我得到一个错误与您的阵列和前缀号码:

Parse error: Invalid numeric literal in (line number of array)...

您可以在阵列定义字符串值,并与(int)投下他们的功能。请参阅下列溶液:

<?php 
function closest($array, $number) { 
    sort($array); 
    foreach ($array as $a) { 
     if ((int) $a > $number) return $a; 
    } 
    return end($array); 
} 

$array = array('0730','0750','0810','0830','0840','0850','0900','0910','0920','0930','0940','0950',1000,1010,1020,1030,1040,1050,1100,1110,1120,1130,1140,1150,1210,1230,1250,1310,1330,1350,1410,1430,1450,1510,1530,1550,1610,1630,1650,1710,1720,1730,1740,1750,1800,1810,1820,1830,1840,1850,1900,1910,1920,1930,1940,1950,2000,2010,2020,2030,2040,2050,2100,2120,2140,2200,2220,2240,2300,2320); 

$nexttime = closest($array, '0930'); 
echo $nexttime; 

演示:含前导零http://ideone.com/TceTRb

0

号码被处理为八进制数,在十进制0730例如是472。如果一个无效的数字(如9)以八进制整数给出,则该数字的其余部分将被忽略。

无论哪种存储您的数字号码的列表作为一个长字符串,然后使用explode()将其转换成一个数组,或者把一个引号周围的4位值来定义数组作为字符串中的每个元素,然后使用(int)正确类型在函数中投射。

<?php 
function closest($array, $number) { 
sort($array); 
foreach ($array as $a) { 
    if ($a >= $number) return $a; 
} 
return end($array); 
} 

$string="0730,0750,0810,0830,0840,0850,0900,0910,0920,0930,0940,0950,1000,1010,1020,1030,1040,1050,1100,1110,1120,1130,1140,1150,1210,1230,1250,1310,1330,1350,1410,1430,1450,1510,1530,1550,1610,1630,1650,1710,1720,1730,1740,1750,1800,1810,1820,1830,1840,1850,1900,1910,1920,1930,1940,1950,2000,2010,2020,2030,2040,2050,2100,2120,2140,2200,2220,2240,2300,2320"; 
$array=explode(",", $string); 
$number = date("Hi"); 
$nexttime = closest($array, $number); 
echo $nexttime;