2016-06-12 58 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;