【问题标题】:How to put switch case statement inside a foreach loop in php?如何将switch case语句放在php的foreach循环中?
【发布时间】:2015-06-23 05:39:41
【问题描述】:

我在 foreach 循环中有以下条件语句。我希望检查所有条件语句。我希望它能够通过使用 switch case 语句来完成。谁能给我一个想法如何做到这一点?还是有其他方法可以做到这一点?一些日期具有关于所有四个条件的值。他们不会检查我是否使用此代码。因为我是新手,所以我很难弄清楚如何做到这一点。如果有人能给出一个想法,那将是一个很大的帮助。

foreach ($query->result() as $row) {

            if ($row->title == 'GK' && $row->type == 'AM') {
                $cal_data[substr($row->date_cal, 8, 2)] = '<div class="gk_am">' . $row->title . ' ' . $row->type . '</div>';
            }  if ($row->title == 'GK' && $row->type == 'PM') {
                $cal_data2[substr($row->date_cal, 8, 2)] = '<div class="gk_pm">' . $row->title . ' ' . $row->type . '</div>';
            } if ($row->title == 'RP' && $row->type == 'AM') {
                $cal_data3[substr($row->date_cal, 8, 2)] = '<div class="rp_am">' . $row->title . ' ' . $row->type . '</div>';
            } if ($row->title == 'RP' && $row->type == 'PM') {
                $cal_data4[substr($row->date_cal, 8, 2)] = '<div class="rp_pm">' . $row->title . ' ' . $row->type . '</div>';
            }     


        } 

【问题讨论】:

  • 每个变量$row-&gt;title$row-&gt;type 的所有可能值是多少?
  • @Gunaseelan 标题为“RP”或“GK”,类型为“AM”或“PM”
  • 那么拉斯克拉特的回答和我的回答就足以满足你的要求了。

标签: php codeigniter foreach switch-statement


【解决方案1】:

使用 else if 条件而不是 only If 条件:

     foreach ($query->result() as $row) {
        if ($row->title == 'GK' && $row->type == 'AM') {
            $cal_data[substr($row->date_cal, 8, 2)] = '<div class="gk_am">' . $row->title . ' ' . $row->type . '</div>';
        } elseif ($row->title == 'GK' && $row->type == 'PM') {
            $cal_data2[substr($row->date_cal, 8, 2)] = '<div class="gk_pm">' . $row->title . ' ' . $row->type . '</div>';
        } elseif ($row->title == 'RP' && $row->type == 'AM') {
            $cal_data3[substr($row->date_cal, 8, 2)] = '<div class="rp_am">' . $row->title . ' ' . $row->type . '</div>';
        } elseif ($row->title == 'RP' && $row->type == 'PM') {
            $cal_data4[substr($row->date_cal, 8, 2)] = '<div class="rp_pm">' . $row->title . ' ' . $row->type . '</div>';
        }     
    } 

【讨论】:

    【解决方案2】:
    foreach ($query->result() as $row) 
    {
        switch($row->title)
        {
            case 'GK':
                switch($row->type)
                {
                    case 'AM':
                        $cal_data[substr($row->date_cal, 8, 2)] = '<div class="gk_am">' . $row->title . ' ' . $row->type . '</div>';
                        break;
                    case 'PM':
                        $cal_data2[substr($row->date_cal, 8, 2)] = '<div class="gk_pm">' . $row->title . ' ' . $row->type . '</div>';
                        break;
                }
            break;
            case 'RP':
                switch($row->type)
                {
                    case 'AM':
                        $cal_data3[substr($row->date_cal, 8, 2)] = '<div class="rp_am">' . $row->title . ' ' . $row->type . '</div>';
                        break;
                    case 'PM':
                        $cal_data4[substr($row->date_cal, 8, 2)] = '<div class="rp_pm">' . $row->title . ' ' . $row->type . '</div>';
                        break;
                }
            break;
    
        }
    }
    

    以上代码与您给定的条件代码相同。看看吧。

    建议您使用switch 语句而不是conditional 语句,我们知道可能会出现什么值。

    【讨论】:

      【解决方案3】:

      如果您想对switch-case 做同样的事情,那么这是一种方法。

      switch($row->title()){
      
        case 'GK':
      
          switch($row->type()){
      
            case 'AM':
            ......
            break;
      
          }
      
           break;
      
      
      ......
      }
      

      【讨论】:

        【解决方案4】:
        foreach ($query->result() as $row) {
        switch($row->title) {
            case 'GK': if($row->type=='AM'){
                 $cal_data[substr($row->date_cal, 8, 2)] = '<div class="gk_am">' . $row->title . ' ' . $row->type . '</div>';
                        }else{
                             $cal_data2[substr($row->date_cal, 8, 2)] = '<div class="gk_pm">' . $row->title . ' ' . $row->type . '</div>';
                        }
                        break ;
            case 'RP':  if($row->type=='AM'){
                            $cal_data3[substr($row->date_cal, 8, 2)] = '<div class="rp_am">' . $row->title . ' ' . $row->type . '</div>';
                        }else{
                             $cal_data4[substr($row->date_cal, 8, 2)] = '<div class="rp_pm">' . $row->title . ' ' . $row->type . '</div>';
                        }
                        break ;     
            }
        

        }

        试试这个

        【讨论】:

          【解决方案5】:

          我认为接近你的情况

          foreach ($query->result() as $row) {
          
          switch (true) {
                              case ($row->title == 'GK' && $row->type == 'AM'):
                               $cal_data[substr($row->date_cal, 8, 2)] = '<div class="gk_am">' . $row->title . ' ' . $row->type . '</div>';
                                  break;
                              case ($row->title == 'GK' && $row->type == 'PM'):
                              $cal_data2[substr($row->date_cal, 8, 2)] = '<div class="gk_pm">' . $row->title . ' ' . $row->type . '</div>';
                                  break;
                              case ($row->title == 'RP' && $row->type == 'AM'):
                              $cal_data3[substr($row->date_cal, 8, 2)] = '<div class="rp_am">' . $row->title . ' ' . $row->type . '</div>';
                                  break;                      
                              case ($row->title == 'RP' && $row->type == 'PM'):
                              $cal_data4[substr($row->date_cal, 8, 2)] = '<div class="rp_pm">' . $row->title . ' ' . $row->type . '</div>';
                                  break;
                          }    
          }
          

          【讨论】:

            【解决方案6】:

            这看起来实际上比它需要的复杂得多。

            $all_cals = [
              'GK' => [
                  'AM' => &$cal_data,
                  'PM' => &cal_data2
              ],
              'RP' => [
                  'AM' => &$cal_data3,
                  'PM' => &cal_data4
              ]
            ];
            
            foreach ($query->result() as $row) {
               $row_cal_data = $all_cals[$row->title][$row->type];
               if (isset($row_cal_data)) {
                  $row_cal_data[substr($row->date_cal, 8, 2)] = '<div class="'.tolower($row->title)."_".tolower($row->type).'">' . $row->title . ' ' . $row->type . '</div>';
               }
            }
            

            根本没有 switch 语句。

            【讨论】:

            • 这里,'gk_am'、'gk_pm'、'rp_am' 和 'rp_pm' 是 css 类。我只是在那个 div 中调用它以获得一些样式。
            • @Stell 明白了。我的示例代码应该产生与您的代码完全相同的结果,当然我还没有测试过它。可能有更好的方法来构建您的 HTML,但我必须更多地了解您的实际用例。
            【解决方案7】:

            放弃整个switch 等,使用array。您也可以使用strtolower() 作为您的班级名称,从而在一行中完成所有操作。您的变量递增($cal_data1,$cal_data2..etc.)而不是数组中的新值,所以$cal_data['date_cal'][0],$cal_data['date_cal'][1]...等。它可能使您的代码更易于使用:

            <?php
            foreach ($query->result() as $row) {
                    // I am not sure if you wish to capture each instance,
                    // but you have no if/elseif so I assume you are capturing
                    // each instance.
                    $cal_data[substr($row->date_cal, 8, 2)][]   =   '<div class="'.strtolower($row->title.'_'.$row->type).'">'.$row->title.' '.$row->type.'</div>';     
                } 
            ?>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多