Я просто записал ужасную функцию PHP, я нуждаюсь в некоторой помощи (elseif цепочка - переключатель?)

MSDN? Я обычно делаю вполне прилично с самим Справочным руководством по библиотеке, и я обычно ожидаю находить ценные статьи там.

9
задан Alex Mcp 13 November 2009 в 20:11
поделиться

6 ответов

Во-первых, пожалуйста, возьмите свои жестко запрограммированные числа и поместите их в константы.

$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;
}

Наконец , некоторые люди могут спросить: "Почему все происходит в таком порядке?" Я вообще не могу претендовать на кредит, кроме как в приложении,

13
ответ дан 4 December 2019 в 08:33
поделиться

Это могло быть излишним, но я бы сделал что-то вроде этого, чтобы я мог поместить все временные диапазоны в одно чистое место:

@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, но думаю, что он похож.

7
ответ дан 4 December 2019 в 08:33
поделиться

Вы можете поместить время и массив для использования в массиве и зациклить их для выбора.

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

Этот метод можно использовать только тогда, когда время не имеет разрыва (один диапазон сразу за другим).

Надеюсь, это поможет.

3
ответ дан 4 December 2019 в 08:33
поделиться

Вы можете использовать оператор switch, делая что-то вроде этого:

switch (true)
{
    case $now < 1258783201:
        // your stuff
        break;
    case $now < 1258783201
        // more of your stuff
        break;
    //...
}

Это по крайней мере немного чище ...

2
ответ дан 4 December 2019 в 08:33
поделиться

Примерно так:

$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];

Вам также нужно подумать о том, нужно ли вам условие «<» или «<=».

0
ответ дан 4 December 2019 в 08:33
поделиться

Возможно, вы захотите изучить шаблон команд; он также может помочь в этом случае.

0
ответ дан 4 December 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: