如何避免if/elseif重复?

4
我将创建一些统计数据,但是遇到了问题... 我从数据库中获取了钓具诱饵线材的信息。
我想要用这些信息来检查所有可能的组合。我的代码如下:
if ((isset($_SESSION['fish_id'])) && (isset($_SESSION['rig_id'])) && (isset($_SESSION['bait_id'])) && (isset($_SESSION['line_id']))) {

   echo '<img class="img-responsive" src="../assets/img/choose_fish.png">';
   echo '<div class="list-notes"> <ul> <li class="name">';
   echo 'FISH , RIG , BAIT , LINE';
   echo '</li></ul></div>';

} elseif ((isset($_SESSION['fish_id'])) && (isset($_SESSION['rig_id'])) && (isset($_SESSION['bait_id'])) && (!isset($_SESSION['line_id']))) {

   echo '<img class="img-responsive" src="../assets/img/choose_fish.png">';
   echo '<div class="list-notes"> <ul> <li class="name">';
   echo 'FISH , RIG , BAIT , *LINE*';
   echo '</li></ul></div>';

} elseif ((isset($_SESSION['fish_id'])) && (isset($_SESSION['rig_id'])) && (!isset($_SESSION['bait_id'])) && (isset($_SESSION['line_id']))) {

   echo '<img class="img-responsive" src="../assets/img/choose_fish.png">';
   echo '<div class="list-notes"> <ul> <li class="name">';
   echo 'FISH , RIG , *BAIT* , LINE';
   echo '</li></ul></div>';

} elseif ((isset($_SESSION['fish_id'])) && (!isset($_SESSION['rig_id'])) && (isset($_SESSION['bait_id'])) && (isset($_SESSION['line_id']))) {

   echo '<img class="img-responsive" src="../assets/img/choose_fish.png">';
   echo '<div class="list-notes"> <ul> <li class="name">';
    echo 'FISH , *RIG* , BAIT , LINE';
   echo '</li></ul></div>';

} ((!isset($_SESSION['fish_id'])) && (isset($_SESSION['rig_id'])) && (isset($_SESSION['bait_id'])) && (isset($_SESSION['line_id']))) {

   echo '<img class="img-responsive" src="../assets/img/choose_fish.png">';
   echo '<div class="list-notes"> <ul> <li class="name">';
   echo '*FISH* , RIG , BAIT , LINE';
   echo '</li></ul></div>';

}

在此之后,我需要检查未设置鱼未设置钓具等等。

我该如何避免这种重复?

2个回答

4

鱼、钓具、诱饵、线似乎完全独立,因此可以将条件分别应用于它们。

以下代码使用三元运算符?:,但本质上与单个if-else结构相同:

echo '<img class="img-responsive" src="../assets/img/choose_fish.png">';
echo '<div class="list-notes"> <ul> <li class="name">';

$items = array();
$items[] = isset($_SESSION['fish_id']) ? 'FISH' : '*FISH*';
$items[] = isset($_SESSION['rig_id']) ? 'RIG' : '*RIG*';
$items[] = isset($_SESSION['bait_id']) ? 'BAIT' : '*BAIT*';
$items[] = isset($_SESSION['line_id']) ? 'LINE' : '*LINE*';
echo join(' , ', $items);

echo '</li></ul></div>';

如果你有更多的项,甚至可以通过循环更加通用地实现(如果只有4个固定的项,则有争议):

echo '<img class="img-responsive" src="../assets/img/choose_fish.png">';
echo '<div class="list-notes"> <ul> <li class="name">';

$items = array();
foreach(array('fish', 'rig', 'bait', 'line') as $name) {
    $id = $name . '_id';
    $nameUppercased = strtoupper($name);
    $items[] = isset($_SESSION[$id]) ? $nameUppercased : "*$nameUppercased*";
}
echo join(' , ', $items);

echo '</li></ul></div>';

@SashantPardeshi,是的,这就是为什么有一个警告词(“四个固定项是否有意义还有待商榷”)。 - Alex Shesterov

1
请使用以下代码。检查变量是否在会话中设置,然后修改字符串。因此,只有在设置了任何一个会话时才会继续进行。
if ( (isset($_SESSION['fish_id']) ) 
     || (isset($_SESSION['rig_id']) ) 
     || (isset($_SESSION['bait_id']) ) 
     || (isset($_SESSION['line_id']) ) ) {

    $names = array();
    $names[] = isset($_SESSION['fish_id']) ? 'FISH' : '*FISH*';
    $names[] = isset($_SESSION['rig_id']) ? 'RIG' : '*RIG*';
    $names[] = isset($_SESSION['bait_id']) ? 'BAIT' : '*BAIT*';
    $names[] = isset($_SESSION['line_id']) ? 'LINE' : '*LINE*';

                    echo '<img class="img-responsive" src="../assets/img/choose_fish.png">';
                    echo '<div class="list-notes"> <ul> <li class="name">';
                    echo (string)implode(' , ', $names);
                    echo '</li></ul></div>';

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接