MSDN? Я обычно делаю вполне прилично с самим Справочным руководством по библиотеке, и я обычно ожидаю находить ценные статьи там.
Во-первых, пожалуйста, возьмите свои жестко запрограммированные числа и поместите их в константы.
$FLIGHT_START_TIME = 1258956001;
$FLIGHT_END_TIME = 1260511201;
Во-вторых, я бы сделал мини-функции для каждого из условных операторов:
Т.е.
function isFlying($time)
{
return ( $FLIGHT_START_TIME < $time && $time < $FLIGHT_END_TIME );
}
Третье , возьмите весь свой набор условий и поместите его в функцию, чтобы получить текущее состояние, и замените в вызовах функций:
function getStateArrayForTime($time)
{
if (isDriving($time)
{
return $driving;
}
if ( isFlying($time) )
{
return $flying;
}
...etc
}
Наконец, замените весь встроенный фрагмент кода единственным вызовом функции:
$currentState = getStateArrayForTime($now);
Как и другие плакаты также прокомментировали, что на этом этапе вы можете использовать функцию, управляемую таблицей данных, для возврата состояния, если вы знаете, что только время начала и окончания будут параметрами состояния:
поэтому замените реализацию getStateArrayForTime на:
function getStateArrayForTime ($time)
{
//
$states = array (
array("startTime" => 1258956001, "endTime" => 1260511201, "state" => $flying),
array("startTime" => 1260511201, "endTime" => 1260517000, "state" => $driving),
..etc...
);
foreach($states as $checkStateArray)
{
if($checkStateArray['startTime'] < $time && $time < $checkStateArray['endTime'])
{
return $checkStateArray['state'];
}
}
return null;
}
Наконец , некоторые люди могут спросить: "Почему все происходит в таком порядке?" Я вообще не могу претендовать на кредит, кроме как в приложении,
Это могло быть излишним, но я бы сделал что-то вроде этого, чтобы я мог поместить все временные диапазоны в одно чистое место:
@timeWindows = ({ start -> 0, end -> 1258783201, array -> $home },
... ,
{start -> 1260511201, end -> MAXVAL, array -> $arrived});
, а затем цикл вроде
$array_to_use = $default;
foreach (my $window in @timeWindows) {
if (($now > $window->start) && ($now < $window->end)) {
$array_to_use = $window->array;
last;
}
}
Извините, это в Perl я не знаю PHP, но думаю, что он похож.
Вы можете поместить время и массив для использования в массиве и зациклить их для выбора.
$Selctions = array(
1258783201 => $Home,
1258956001 => $Driving,
1260511201 => $Flying,
...
1260511201 => $Arriving
);
// MUST SORT so that the checking will not skip
ksort($Selction);
$TimeToUse = -1;
$Now = ...;
foreach ($Selctions as $Time => $Array) {
if ($Now < $Time) {
$TimeToUse = $Time;
break;
}
}
$ArrayToUse = ($TimeToUse != -1) ? $Selctions[$TimeToUse] : $Default;
Этот метод можно использовать только тогда, когда время не имеет разрыва (один диапазон сразу за другим).
Надеюсь, это поможет.
Вы можете использовать оператор switch, делая что-то вроде этого:
switch (true)
{
case $now < 1258783201:
// your stuff
break;
case $now < 1258783201
// more of your stuff
break;
//...
}
Это по крайней мере немного чище ...
Примерно так:
$array_to_use = null;
$dispatch = array(1258783201, $home, 1258956001, $driving, ..., $arrived);
for ($i=0; i<count($dispatch); $i+=2) {
if ($now<$dispatch[$i]) {
$array_to_use = $dispatch[$i+1];
break;
}
}
if ($array_to_use==null) $array_to_use = $dispatch[count($dispatch)-1];
Вам также нужно подумать о том, нужно ли вам условие «<» или «<=».
Возможно, вы захотите изучить шаблон команд; он также может помочь в этом случае.