Швидший спосіб написати ці кілька інших?

Чи є спосіб простіше та швидше писати це?

$currTime = date('H:i');
if ($currTime >= "12:09" && $currTime <= "16:08") {
    echo rand(260, 272);
} elseif ($currTime >= "16:09" && $currTime <= "18:08") {
    echo rand(278, 286);
} elseif ($currTime >= "18:09" && $currTime <= "20:08") {
    echo rand(293, 303);
} elseif ($currTime >= "20:09" && $currTime <= "23:38") {
    echo rand(338, 359);
} elseif ($currTime >= "23:39" && $currTime <= "23:59") {
    echo rand(293, 302);
} elseif ($currTime >= "01:06" && $currTime <= "02:08") {
    echo rand(195, 210);
} elseif ($currTime >= "02:09" && $currTime <= "02:23") {
    echo rand(168, 179);
} elseif ($currTime >= "02:24" && $currTime <= "07:08") {
    echo rand(121, 128);
} elseif ($currTime >= "07:09" && $currTime <= "09:08") {
    echo rand(143, 160);
} elseif ($currTime >= "09:09" && $currTime <= "12:08") {
    echo rand(187, 207);
} else {
    echo rand(233, 241);
}
0
Гаразд, як ти це робиш?
додано Автор jraede, джерело
Ви можете навіть зробити виписку з умовами ($ a <$ b && $ b
додано Автор jraede, джерело
Ви можете навіть зробити виписку з умовами ($ a <$ b && $ b
додано Автор jraede, джерело
@jraede Я думаю, що Баба посилається на switch (true) і поставив умови в твердженнях випадку. Це найгірше зловживання заявками, які я коли-небудь знав, і, на жаль, здається популярним у php. Непогана частина полягає в тому, що вона не дає абсолютно ніяких переваг у тому, що якщо/зчеплення.
додано Автор Dave, джерело
@jraede Я думаю, що Баба посилається на switch (true) і поставив умови в твердженнях випадку. Це найгірше зловживання заявками, які я коли-небудь знав, і, на жаль, здається популярним у php. Непогана частина полягає в тому, що вона не дає абсолютно ніяких переваг у тому, що якщо/зчеплення.
додано Автор Dave, джерело
Перемикач @Revent не має діапазонів. Одна справа, я б сказала, що насправді немає необхідності мати першу умову в кожній перевірці; просто додайте нову умову у верхній кут менш ніж за 12:09 . Ніякий елегантний спосіб не нагадує. Було б швидше попередньо конвертувати в Ints, але PHP повільно в будь-якому випадку, тому я б не піклувався про те, що занадто багато.
додано Автор Dave, джерело
Перемикач @Revent не має діапазонів. Одна справа, я б сказала, що насправді немає необхідності мати першу умову в кожній перевірці; просто додайте нову умову у верхній кут менш ніж за 12:09 . Ніякий елегантний спосіб не нагадує. Було б швидше попередньо конвертувати в Ints, але PHP повільно в будь-якому випадку, тому я б не піклувався про те, що занадто багато.
додано Автор Dave, джерело
@jraede так, ви можете зробити перемикач таким чином
додано Автор Baba, джерело
@jraede так, ви можете зробити перемикач таким чином
додано Автор Baba, джерело
Напевно, більш надійним способом є створення масиву з масивом (mintime, maxtime, minrand, maxrand) , цикл через нього, if (mintime <= time & & maxtime> = time) {echo rand (minrand, maxrand); break} . Таким чином, вам потрібно лише скрипти з масивом пізніше, а не змінювати логіку. BTW: ви, звичайно, можете switch (true) {case $ currTime> = "12:09" && $ currTime <= "16:08": ... і т.д. , але це не будь-який прибиральник.
додано Автор Wrikken, джерело
Може бути, switch() , але за цих кількох умов приріст продуктивності буде незначним.
додано Автор Revent, джерело

9 Відповіді

Не дивіться на більш швидкий спосіб ... Подивіться на правильні способи ....

  • Never compare date or time like strings
  • use mt_rand instead of rand
  • Use functions or object rather than long switch or if else

Приклад:

$currTime = new DateTime();

$range = [
        new TimeRange("12:09-16:08", "260-272"),
        new TimeRange("16:09-18:08", "278-286"),
        new TimeRange("18:09-20:08", "293-303"),
        new TimeRange("20:09-23:38", "338-359"),
        new TimeRange("23:39-23:59", "195-210"),
        new TimeRange("01:06-02:23", "168-179"),
        new TimeRange("02:24-07:08", "121-128"),
        new TimeRange("07:09-09:08", "143-160"),
        new TimeRange("09:09-12:08", "187-241")
];

foreach($range as $timeRange) {
    if ($timeRange->inRange($currTime)) {
        printf("Current Time\t: %s\n", $currTime->format("H:i"));
        printf("Range Time\t: %s\n", $timeRange->getRange());
        printf("Random Value\t: %s\n", $timeRange->getRandom());
        break;
    }
}

Вихідні дані

Current Time    : 01:53
Range Time      : 01:06 - 02:23
Random Value    : 168

Використовуваний клас

class TimeRange {
    private $timeFrom, $timeTo;
    private $numFrom, $numTo;
    private $format;

    function __construct($time, $number, $format = "H:i") {
        list($timeFrom, $timeTo) = explode("-", $time);
        list($this->numFrom, $this->numTo) = explode("-", $number);
        $this->timeFrom = DateTime::createFromFormat($format, $timeFrom);
        $this->timeTo = DateTime::createFromFormat($format, $timeTo);
        $this->format = $format;
    }

    function inRange(DateTime $currTime) {
        return $currTime >= $this->timeFrom && $currTime <= $this->timeTo;
    }

    function getRandom() {
        return mt_rand($this->numFrom, $this->numTo);
    }

    function getRange() {
        return sprintf("%s - %s", $this->timeFrom->format($this->format), $this->timeTo->format($this->format));
    }
}
3
додано
Не хвилюйтеся про час обробки - просто те, що написання цілого класу для цього простого компаратора виглядає марною тратою часу, коли проблему, яку ви намагаєтеся вирішити, можна вирішити за допомогою strtotime() . Там не буде ніякої двозначності, оскільки він використовує лише раз.
додано Автор jraede, джерело
Чи не створює цілий клас для цього трохи посилення? Ви можете просто отримати цілий еквівалент часу за допомогою strtotime()
додано Автор jraede, джерело
$currTime = date('H:i');

$timevals=Array(
"23:39" => Array(293,302),
"20:09" => Array(338,359),
"18:09" => Array(293,303),
//... (etc, descending order)
);

foreach($timevals AS $time => $vals) {
  if($curtime >=$time) {
    echo rand($vals[0],$vals[1]);
    break;
  }
}
3
додано
Щоб зробити це очевидним для ОР - доки ваш час буде правильним, вам доведеться лише перевірити, що час перевищує один раз, перш ніж переходити до наступного (доки ви не отримаєте опівночі).
додано Автор Danack, джерело
$currTime = date('H:i');

$timevals=Array(
"23:39" => Array(293,302),
"20:09" => Array(338,359),
"18:09" => Array(293,303),
//... (etc, descending order)
);

foreach($timevals AS $time => $vals) {
  if($curtime >=$time) {
    echo rand($vals[0],$vals[1]);
    break;
  }
}
3
додано
Щоб зробити це очевидним для ОР - доки ваш час буде правильним, вам доведеться лише перевірити, що час перевищує один раз, перш ніж переходити до наступного (доки ви не отримаєте опівночі).
додано Автор Danack, джерело

Візьміть моє рішення) Це скорочує та спрощує код.

<?
function plan($a, $b, $c, $d)
{
    $t = date('H:i');
    if ($a <= $t && $t <= $b) { echo rand($c, $d); }
}
plan("12:09", "16:08", 260, 272);
plan("16:09", "18:08", 278, 286);
plan("18:09", "20:08", 293, 303);
plan("20:09", "23:38", 338, 359);
plan("23:39", "23:59", 293, 302);
plan("00:00", "01:05", 233, 241);
plan("01:06", "02:08", 195, 210);
plan("02:09", "02:23", 168, 179);
plan("02:24", "07:08", 121, 128);
plan("07:09", "09:08", 143, 160);
plan("09:09", "12:08", 187, 207);
?>
0
додано
я не можу отримати будь-який вихід
додано Автор EnexoOnoma, джерело
Підроблені користувачі в Інтернеті, а? : D
додано Автор ZLOI_DED, джерело
Зараз це працює)
додано Автор ZLOI_DED, джерело
Ou ... Як ми можемо порівняти два рядні значення? : р
додано Автор ZLOI_DED, джерело

Візьміть моє рішення) Це скорочує та спрощує код.

<?
function plan($a, $b, $c, $d)
{
    $t = date('H:i');
    if ($a <= $t && $t <= $b) { echo rand($c, $d); }
}
plan("12:09", "16:08", 260, 272);
plan("16:09", "18:08", 278, 286);
plan("18:09", "20:08", 293, 303);
plan("20:09", "23:38", 338, 359);
plan("23:39", "23:59", 293, 302);
plan("00:00", "01:05", 233, 241);
plan("01:06", "02:08", 195, 210);
plan("02:09", "02:23", 168, 179);
plan("02:24", "07:08", 121, 128);
plan("07:09", "09:08", 143, 160);
plan("09:09", "12:08", 187, 207);
?>
0
додано
я не можу отримати будь-який вихід
додано Автор EnexoOnoma, джерело
Підроблені користувачі в Інтернеті, а? : D
додано Автор ZLOI_DED, джерело
Зараз це працює)
додано Автор ZLOI_DED, джерело
Ou ... Як ми можемо порівняти два рядні значення? : р
додано Автор ZLOI_DED, джерело
$currTime = date('H:i');


$arr=array

(
"12:09,16:08"=>'260,272',
"16:09,18:08"=>'278, 286',
"18:09,20:08"=>'293, 303',
"20:09,23:38"=>'338, 359',
"23:39,23:59"=>'293, 302',
"01:06,02:08"=>'195, 210',
"00:00,00:30" =>'1,10'
//etc,etc...

);

foreach ($arr as $key=>$value) {



$key=explode(',',$key);
$value=explode(',',$value);

if( $currTime>= $key[0] && $currTime<=$key[1]) {
echo  rand($value[0],$value[1]);    

}




}


...however, i would keep OP's code as it is... :)
0
додано

Check http://www.phpbench.com/

Контрольні структури

switch/case/default VS. if/elseif/else

Контрольні структури               | Total time
---------------------------------|-----------
if and elseif (using ==)         | 190 µs
if, elseif and else (using ==)   | 189 µs
if and elseif (using ===)        | 158 µs
if, elseif and else (using ===)  | 170 µs
switch/case                    | 200 µs
switch/case/default`         | 228 µs

Висновок:

Використання switch/case або if/elseif майже однакове . Примітка , що тест є невідомим === (точно дорівнює) і трохи швидше за допомогою == (дорівнює).

0
додано

Для цього немає більш чистих способів, вимикач не буде працювати в цьому випадку. Все, що ви можете зробити, це зробити ваш, якщо це трохи коротше, але це про це. Я думаю, що ваш підхід у цій ситуації досить хороший.

0
додано

Для цього немає більш чистих способів, вимикач не буде працювати в цьому випадку. Все, що ви можете зробити, це зробити ваш, якщо це трохи коротше, але це про це. Я думаю, що ваш підхід у цій ситуації досить хороший.

0
додано
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php