【问题标题】:PHP Get variable to equal value of switchPHP获取变量以等于开关的值
【发布时间】:2011-02-22 22:27:54
【问题描述】:

我试图在我的页面上获取一个变量来等于我拥有的开关的结果。

这是代码:

$payment_method = switch ($cardtype) {
case "visa" : echo "VSA"; break;
case "mastercard" : echo "MSC"; break;
case "maestro" : echo "MAE"; break;
case "amex" : echo "AMX" ; break;
default : echo "Please specify a payment method!"; break;
};

我怎样才能让 $payment_method 等于这个结果????

到目前为止,我收到一个错误:

Parse error: syntax error, unexpected T_SWITCH in /var/www/account/credits/moneybookers/process.php on line 65

【问题讨论】:

  • @Col。弹片:大声笑,来自同一个用户的同一个问题%-)
  • 不太一样。他现在要求变量赋值,而不是回显。但这就是为什么所有这些代码都不好的原因:他只是在不理解的情况下复制/粘贴它。

标签: php variables switch-statement


【解决方案1】:

您不能以这种方式使用switch 构造。您必须在 case 部分中分配 $payment_method

在您的情况下,无论如何您都是 echo ,您可以删除 $payment_method = ,它应该可以工作。

不过,将所有东西放入一个数组中会容易得多:

$payment_methods = array(
  "visa" => "VSA",
  "mastercard" => "MSC",
  "maestro" => "MAE",
  "amex" => "AMX"
);

if (!array_key_exists($cardtype, $payment_methods))
 echo "Please specify a payment method!";
else
 echo "Your method: ".$payment_methods[$cardtype];

【讨论】:

    【解决方案2】:

    你应该这样做:

    $payment_method = '';
    
    switch ($cardtype) {
      case "visa" : $payment_method = "VSA"; break;
      case "mastercard" : $payment_method = "MSC"; break;
      case "maestro" : $payment_method = "MAE"; break;
      case "amex" : $payment_method = "AMX" ; break;
    }
    
    if (strlen($payment_method))
    {
      echo $payment_method;
    }
    else
    {
      echo "Please specify a payment method!";
    }
    

    【讨论】:

    • default : $payment_method = "请指定付款方式!"; // 使用此实现,将无法获取付款方式是否有效。
    • @zerkms:对,固定的主要,请考虑你的反对票。谢谢
    • @Wed Logic: 已修复 ;-) 顺便说一句,当 $cardtype 无效时,他会收到此代码的通知
    • @zerkms:他会注意到什么,却无法得到你?
    • 现在 - 什么都没有。我已经评论了没有 if(strlen()) 的修订 #2,您稍后添加了它;-)
    【解决方案3】:

    您应该在开关中分配值

    switch ($cardtype) {
        case "visa":
            $payment_method = "VSA";
        break;
        case "mastercard":
            $payment_method = "MSC";
        break;
        case "maestro":
            $payment_method = "MAE";
        break;
        case "amex":
            $payment_method = "AMX";
        break;
        default:
            echo "Please specify a payment method!";
        break;
    };
    

    【讨论】:

      【解决方案4】:

      这样做:

      $types = array('visa' => 'VSA', 'mastercard' => 'MSC', 'maestro' => 'MAE', 'amex' => 'AMX');
      if (isset($types[$cardtype])) {
          $payment_method = $types[$cardtype];
      } else {
          echo 'Please specify a payment method!';
      }
      

      【讨论】:

        【解决方案5】:

        使用数组!

        $types = array("visa"       => "VSA",
                       "mastercard" => "MSC",
                       "maestro"    => "MAE",
                       "amex"       => "AMX");
        
        $type = @$types[$cardtype] or echo "Please specify a payment method!";
        

        【讨论】:

          【解决方案6】:

          对于您的应用程序,关联数组将是最佳解决方案。但是,要回答您的问题,您可以使用 ?运营商

          var card  = 'amex'; //however you retrieve that value
          
          var method = card == 'visa' ? 'VSA' : card == 'mastercard' ? 'MSC' : card == 'maestro' ? 'MAE' : card == 'amex' : 'AMX' : null;  //default value is null
          
          //  store error msgs elsewhere in the code, to ease translation/alteration
          var errs = {
           'ENG', {'Please specify a payment method', '...', '...', '...'},
           'ESP', {'Favor, indique la forma de pago', '...', '...', '...'},
           'DEU', {'Bitte geben Sie eine Zahlungsmethode', '...','...','...'}
          }
          
          //  alert the appropriate error message, in the current language
          
          var currentLang = 0; //however you set that value
          if(!method) alert(errs[currentLang][0]);
          

          【讨论】:

          • 您不应该以这种方式使用三元运算符。可读性是最重要的,在这种情况下切换是最好的方法。
          【解决方案7】:

          如果你不想改变你的代码(比如你有很长的开关),你可以使用Output Buffering

          <?php
          ob_start();
          switch ($cardtype) {
          case "visa" : echo "VSA"; break;
          case "mastercard" : echo "MSC"; break;
          case "maestro" : echo "MAE"; break;
          case "amex" : echo "AMX" ; break;
          default : echo "Please specify a payment method!"; break;
          };
          $payment_method = ob_get_clean();
          ?>
          

          ob_start() 将开始输出缓冲(这也将停止输出),ob_get_clean() 将结束它,返回 ob 运行时回显的所有内容。

          因此,例如,如果$cardtype 是签证,则 $payment_method 将等于 VSA。

          希望对你有帮助。

          注意:这可能不是一个好的解决方案,如果可能,请使用任何其他答案的解决方案。 Pekka 的回答真的很好,试试他的。

          【讨论】:

            【解决方案8】:

            使用match 声明。

            https://www.php.net/manual/en/control-structures.match.php

            例子:

            
            $message = match ($statusCode) {
                200, 300 => null,
                400 => 'not found',
                500 => 'server error',
                default => 'unknown status code',
            };
            

            还有:https://stitcher.io/blog/php-8-match-or-switch

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-02-15
              • 1970-01-01
              • 1970-01-01
              • 2013-04-28
              • 2015-01-27
              • 2019-07-23
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多