2016-06-12 2 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

fyi prefixing number with '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; 
Смежные вопросы