2016-06-12 13 views
0

Ich habe ein Array mit einer Reihe von militärischen Zeiten aufgelistet und ich versuche, den nächstliegenden Wert bis zur aktuellen Zeit zu finden. Zum Beispiel, wenn es 9:30 Uhr ist, sollte es 9:40 Uhr zurückkehren, weil das die nächste größte Zeit ist, aber stattdessen wird es 10:00 Uhr zurückkehren, egal wie spät es ist.Nicht den nächsten größten Wert in meinem Array

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")); 

ich durch es gab viele Male versucht, das Problem zu diagnostizieren, zu versuchen, all die Nullen vor den ersten paar Male entfernen zurück ein noch seltsamere Ergebnis 07.00.

+0

Fyi, das eine Zahl mit '0' voranstellt, sagt php, um es als oktal zu interpretieren. –

+1

Haben Sie versucht, das Array nach dem Sortieren mit print_r auszugeben? – bksi

+0

es scheint, dass es immer endet Ende ($ Array) – bksi

Antwort

0

Ich habe einen Fehler mit Ihrem Array und dem Präfix Zahlen:

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

Sie können die Werte auf Array als String definieren und diese mit (int) auf die Funktion gegossen. Siehe folgende Lösung:

<?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; 

Demo:http://ideone.com/TceTRb

0

Zahlen mit führenden Nullen werden als Oktalzahlen behandelt, 0730 zum Beispiel 472 in dezimal. Wenn eine ungültige Ziffer wie 9 in einer oktalen Ganzzahl angegeben wird, wird der Rest der Zahl ignoriert.

Speichern Sie Ihre Liste der Ziffern als eine lange Zeichenfolge und verwenden Sie explode(), um es in ein Array zu konvertieren und um den vierstelligen Wert ein Anführungszeichen zu setzen, um jedes Element des Arrays als Zeichenfolge zu definieren. Verwenden Sie dann (int) für den richtigen Typ Casting in der Funktion.

<?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; 
Verwandte Themen