Осы бірнеше рет жазу үшін тезірек тәсілі?

бұл жазудың қарапайым және тезірек тәсілі бар ма?

$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-де танымал болып көрінеді. Керемет бөлігі - бұл егер/else ілінісуден ешқандай артықшылық бермейді.
қосылды автор Dave, көзі
@jraede Мен Бабаның switch (true) -қа сілтейтінін және жағдайды баяндауға жағдай деп ойлаймын. Бұл мен білетін коммутация туралы мәлімдемелердің ең көп теріс пайдаланылуы, және, өкінішке орай, php-де танымал болып көрінеді. Керемет бөлігі - бұл егер/else ілінісуден ешқандай артықшылық бермейді.
қосылды автор Dave, көзі
@Revent қосқышы диапазоны жоқ. Бір нәрсені айтсам, шын мәнінде әр тексерудегі алғашқы шартты қажет етпейді; 12:09 -ден азырақ жаңа шартты қосыңыз. Ешқандай талғампаз жол ақылға қонымды емес. Алғашқы сандарға көшу жылдамырақ болар еді, бірақ PHP баяу жүреді, сондықтан мен бұл туралы тым көп ойламаймын.
қосылды автор Dave, көзі
@Revent қосқышы диапазоны жоқ. Бір нәрсені айтсам, шын мәнінде әр тексерудегі алғашқы шартты қажет етпейді; 12:09 -ден азырақ жаңа шартты қосыңыз. Ешқандай талғампаз жол ақылға қонымды емес. Алғашқы сандарға көшу жылдамырақ болар еді, бірақ PHP баяу жүреді, сондықтан мен бұл туралы тым көп ойламаймын.
қосылды автор Dave, көзі
@ jraede иә Сіз осылай ауыса аласыз
қосылды автор Baba, көзі
@ jraede иә Сіз осылай ауыса аласыз
қосылды автор Baba, көзі
array (mintime, maxtime, minrand, maxrand) жазбаларымен массив жасай алсаңыз, if (mintime <= time && maxtime> = time) {echo rand (minrand, maxrand); үзілім} . Сондықтан, логиканы өзгертудің орнына, алаптың көмегімен ғана скрипить қажет. 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, көзі
қосылды автор Baba, көзі
$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
қосылды

Бұл әрекетті орындаудың таза жолы жоқ, бұл жағдайда switch нұсқауы жұмыс істемейді. Сіз жасай алатын барлық нәрсе - егер сіз біраз қысқа болса, онда бұл туралы. Менің ойымша, бұл жағдайда сіздің жағдайыңыз жақсы.

0
қосылды

Бұл әрекетті орындаудың таза жолы жоқ, бұл жағдайда switch нұсқауы жұмыс істемейді. Сіз жасай алатын барлық нәрсе - егер сіз біраз қысқа болса, онда бұл туралы. Менің ойымша, бұл жағдайда сіздің жағдайыңыз жақсы.

0
қосылды