如何使这段代码更有效,而不是有这么多的elseif语句


How to make this code more efficient instead of having so many elseif statements?

代替:

if($today >= $dateOne && $dateOne != '0000-00-00')
    {
    run some code
    }
elseif($today >= $dateTwo && $dateTwo != '0000-00-00')
    {
    run some code
    }
elseif($today >= $dateThree && $dateThree != '0000-00-00')
    {
    run some code
    }
elseif($today >= $dateFour && $dateFour != '0000-00-00')
    {
    run some code
    }
else
    {
    run this code
    }

…上升到$dateEleven,还有更好的原因吗?我想一定有比这些elseif语句更好的方法

$dates = Array( 1 => $dateOne, 2 => $dateTwo, ... );
foreach($dates as $key => $date) {
  if($today > $date && $date != '0000-00-00') {
      $date_key = $key;
      break ; // exit loop
  }
}
switch($date_key) {
   case 1:
      // code 1
      break;
   case 2:
      // code 2
      break;
   case 3:
      // code 3
      break;
   case 4:
   case 5:
      // etc.
      break;
}

实际上只有一个变量在变化。我不知道这是从哪里来的,但是你可以把它们都放入某种数据结构中,比如数组,然后写一个循环,它正好做你想做的事情。

每当你遇到这样的情况,看看你有什么,什么是真正的变化。如果你想解决这样的问题,循环通常是你想要开始寻找的地方。

如果所有日期都可以是'0000-00-00',那么循环是不可避免的。

$dates = array($dateOne, $dateTwo ...);
foreach ($dates as $date) {
    if($today >= $date && $dateOne != '0000-00-00') {
        // run some code
        break;
    }
}

然而,如果这些日期来自mysql数据库,您必须使用查询来确定是否必须运行一些代码。

所以,你最好描述一个你想要实现的真实任务,然后从SQL查询中得到正确的答案。

应该是

SELECT min(date) FROM table WHERE date <> '0000-00-00' AND [other conditions]

然后比较返回值,就像这样

if ($row && $today >= $row['date']) {
function validate($date) {
    return $today >= $date && $date != '0000-00-00';
}
$dates = [$dateOne, $dateTwo, $dateThree, $dateFour];
if(count($filtered = array_filter($dates, 'validate'))) {
    $date = $filtered[0]; // This is the date that triggered the first IF in your code
    // run some code
}
else {
    // run this code
}