【问题标题】:correct syntax for php switch case statement when using arrays and adding elements to a different array使用数组并将元素添加到不同数组时 php switch case 语句的正确语法
【发布时间】:2015-02-24 11:36:57
【问题描述】:

能否请您帮我找到正确的语法,将 switch 语句放在数组上,然后在每种情况下,向新数组中添加一个元素。

我有一个 2 步表单(实际上是使用相同 php 文件的 2 个表单)。在第一个表单中,用户输入食物名称,选择是否要使用克或杯作为份量,然后选择每日或每周计算。

一旦提交第一个表格,就会从数据库中检索与他们的食物匹配的食物,并显示在表格 #2 中,食物名称旁边有一个复选框。他们可以取消选择他们不想要的任何匹配项。这一切都很好。

提交第二份表格后,维生素 C 的含量是通过从数据库中提取每种食物中的维生素 C 含量(以克或杯为单位)来计算的。 php 代码根据他们选择的份量计算维生素 C 的量(有许多克数选项和许多杯子选项)。这是我想不通的switch语句。

表格#2是:

<!--START DISPLAY OF FORM 2-->
                            <div class="step2">
                          <div class="row">
                                 <h2>Step 2 of 2</h2>
                                </div>
                              <div class="row"> <h3>We Found these matching foods. </h3> <ol><li><h4>Uncheck the ones you don't want to include in your calculation.</h4></li><li><h4>Enter your serving size.  If daily, enter amount of each food you feed your guinea pig each day.  If weekly, enter total amounts that you give him each week.</h4></li><li><h4>Click "Calculate my Vitamin C".</h4></li></ol></div>

                               <form id="step2" class="form-horizontal" method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>">


                                   <?php  if ($servingsize == "grams") { 
                                      foreach ($results as $CurRes) {
                                    echo '<div class="row">' . '<div class="col-sm-1">' . '<input type="checkbox" name="foodname[]" ' . 'value="'.$CurRes['name'].'"' . 'checked>'. '</div>' . '<div class="col-sm-2">' .$CurRes['name'] .'</div>' . '<div class="col-sm-9">'; ?>
                                       <fieldset>
                                <!-- Select Basic -->
                                         <div class="control-group">
                                           <label class="control-label" for="amountg">Amount</label>
                                           <div class="controls">
                                             <select id="amountg" name="amountg[]" class="input-medium">
                                              <option value="10">10g</option>
                                              <option value="20">20g</option>
                                              <option value="30">30g</option>
                                              <option value="40">40g</option>
                                              <option value="50">50g</option>
                                              <option value="60">60g</option>
                                              <option value="70">70g</option>
                                              <option value="80">80g</option>
                                              <option value="90">90g</option>
                                              <option value="100">100g</option>
                                              <option value="110">110g</option>
                                              <option value="120">120g</option>
                                              <option value="130">130g</option>
                                              <option value="140">140g</option>
                                              <option value="150">150g</option>
                                              <option value="160">160g</option>
                                              <option value="170">170g</option>
                                              <option value="180">180g</option>
                                              <option value="190">190g</option>
                                              <option value="200">200g</option>
                                             </select>
                                               </fieldset>
                                              </div><!--end of div class controls-->
                                             </div><!--end of div class control-group-->
                                           </div><!--end of div class-col-sm-9-->
                                         </div><!--end of div class=row-->
                                 <?php } //end of foreach 
                            } else /*end of if servingsize="grams"*/ { 
                               foreach ($results as $CurRes) { 
                                     echo '<div class="row">' . '<div class="col-sm-1">' . '<input type="checkbox" name="foodnames[]" ' . 'value="'.$CurRes['name'].'"' . 'checked>'. '</div>' . '<div class="col-sm-2">' .$CurRes['name'] .'</div>' . '<div class="col-sm-9">'; ?>
                               <fieldset> 
                                <!-- Select Basic -->
                                  <div class="control-group" style="display:inline">
                                    <label class="control-label" for="cups">Amount</label>
                                    <div class="controls" style="display:inline">
                                     <select id="cups" name="cups" class="input-medium">
                                       <option value="1/4">1/4 cup</option>
                                       <option value="1/2">1/2 cup</option>
                                       <option value="3/4">3/4 cup</option>
                                       <option value="1">1 cup</option>
                                       <option value="1 1/4">1 1/4 cups</option>
                                       <option value="1 1/2">1 1/2 cups</option>
                                       <option value="1 3/4">1 3/4 cups</option>
                                       <option value="2">2 cups</option>
                                       <option value="2 1/4">2 1/4 cups</option>
                                       <option value="2 1/2">2 1/2 cups</option>
                                       <option value="2 3/4">2 3/4 cups</option>
                                       <option value="3">3 cups</option>
                                     </select>
                                     </div><!--end of div class controls-->
                                    </div><!--end of div class control-group-->
                                   </div><!--end of div class col-sm-5-->
                                 </div><!--end of div class row-->
                               </fieldset>
                             <?php } /*end of foreach*/
             } /* end of else - (is cups)*/ ?>
                         <p><input type="submit" value="Calculate my Vitamin C" name="form2"></p> 
                      </form>
           </div><!--end of <div class="step2">-->


 <!--END STEP 2-->   

switch语句为:

/*GOAL HERE IS: take the amount they selected on the form and convert the mysql results based on serving size.  For example, if they selected 50 grams, that's .5 * $curRes['mgc100g']*/
if (isset($_POST['form2'])) {
if ($servingsize == "grams") {
foreach ($_POST['foodname'] as $value) {
    $vitc=array();
    switch ($value) {
      case "10":
         $vitc[] = $curRes['mgc100g']/10;
         break;
      case "20":
         $vitc[] = $curRes['mgc100g']/5;
         break;
      case "30":
          $vitc[] = $curRes['mgc100g']/3.3333;
         break;
      case "40":
            $vitc[] = $curRes['mgc100g']/2.5;
         break;
      case "50":
            $vitc[] = $curRes['mgc100g']/2;
         break;
      case "60":
            $vitc[] = $curRes['mgc100g']/1.667;
        break;
      case "70":
            $vitc[] = $curRes['mgc100g']/1.4286;
        break;
      case "80":
             $vitc[] = $curRes['mgc100g']/1.25;
        break;
      case "90":
             $vitc[] = $curRes['mgc100g']/1.1111;
        break;
      case "100":
             $vitc[] = $curRes['mgc100g'];
        break;
      case "110":
            $vitc[] = $curRes['mgc100g']*1.1;
        break;
      case "120":
            $vitc[] = $curRes['mgc100g']*1.2;
        break;
      case "130":
           $vitc[] = $curRes['mgc100g']*1.3;
        break;
      case "140":
           $vitc[] = $curRes['mgc100g']*1.4;
        break;
      case "150":
           $vitc[] = $curRes['mgc100g']*1.5;
        break;
      case "160":
           $vitc[] = $curRes['mgc100g']*1.6;
        break;
      case "170":
           $vitc[] = $curRes['mgc100g']*1.7;
        break;
      case "180":
           $vitc[] = $curRes['mgc100g']*1.8;
        break;
      case "190":
            $vitc[] = $curRes['mgc100g']*1.9;
        break;
     case "200":
            $vitc[] = $curRes['mgc100g']*2;
        break;
     default:
        echo "We couldn't calculate that. Sorry!";
     }//end of switch statement
     return $vitc;
    } //end of foreach loop
   } else { //end of if $servingsize == grams
foreach ($_POST['foodnames'] as $values) {
  $vitcc = array();
    switch ($value) {
        case "1/4":
          $vitcc[] = $curRes['mgc1cup']/4;
        break;
        case "1/2":
           $vitcc[] = $curRes['mgc1cup']/2;
        break;
        case "3/4":
          $vitcc[] = $curRes['mgc1cup']/1.3333;
        break;
        case "1":
           $vitcc[] = $curRes['mgc1cup'];
        break;
        case "1 1/4":
          $vitcc[] = $curRes['mgc1cup']*1.25;
        break;
        case "1 1/2":
          $vitcc[] = $curRes['mgc1cup']*1.5;
        break;
        case "1 3/4":
          $vitcc[] = $curRes['mgc1cup']*1.75;
        break;
        case "2":
          $vitcc[] = $curRes['mgc1cup']*2;
        break;
        case "2 1/4":
          $vitcc[] = $curRes['mgc1cup']*2.25;
        break;
        case "2 1/2":
          $vitcc[] = $curRes['mgc1cup']*2.5;
        break;
        case "2 3/4":
           $vitcc[] = $curRes['mgc1cup']*2.75;
        break;
        case "3":
           $vitcc[] = $curRes['mgc1cup']*3;
        break;
     default:
        echo "We couldn't calculate that. Sorry!";
     }//end of switch statement
     return $vitcc;
    } //end of foreach loop
  } //end of else statement (i.e., $servingsize is cups)
 } //end of if isset($_POST('form2'))
/*ADD TOTAL OF VITAMIN C mg*/
if ($_POST['radios'] == "grams") {
   foreach ($vitc as $amount) {
    $totalvitcgrams = round(array_sum($vitc), 1);
     return $totalvitcgrams;
        } //end of foreach
} elseif ($_POST['radios'] == "cups") {  //end of if $_POST['amountg'] == grams
   foreach ($vitcc as $amounts) {
    $totalvitccups = round(array_sum($vitcc), 1);
     return $totalvitccups;
        } //end of foreach
} /* end of elseif ($_POST['amountg'] != grams*/ else {
    echo 'An error occurred.  Sorry!'; }
//Calculate daily amount of Vitamin c from weekly totals
if ($weekly == "true") {
  $weektodaygrams = $totalvitcgrams/7;
  $weektodaycups = $totalvitccups/7;
}//end of if $weekly == true
?>

我收到“错误:在第 320 行为 foreach() 提供的参数无效)”,即“return $totalvitccups;”

$curRes['mgc1cup'] 是从数据库中提取的数据。

我已经尝试了两天能想到的所有方法,但仍然无法正常工作。

所以我有一个名为 foodname[] 形式的数组。我需要检查每个提交的食物名称,如果存在,根据选择的份量对其进行计算,然后将结果放入一个数组中,我将其命名为 vitc(克)和 vitcc(杯子) .

我已经对所有内容进行了 var_dump 并将其放在代码中的多个位置,但我没有显示任何内容。我得到的唯一错误是无效参数,这对我没有多大帮助。

那么如何在 switch 语句的每种情况下进行每个计算并将其添加到数组中?因为在我有了数组之后,我会将数组中的所有值相加得到总量。获取数组是个问题。

整个代码很长,但如果你想看,它是here。食物名称的字段形式可以是 1-20 个字段(使用 javascript 动态填充)。

如果您需要在启用 javascript 的情况下查看它,请输入 here(输入“hello”)。

我的编码不是很好。我阅读了 3 本关于 php 的书籍并完成了 2 门关于 php 的在线课程,但是当我坐下来编写代码时,我在做我想做的事情时遇到了很大的问题。但我一直在尝试,尝试和尝试。但这一次我真的被困住了。

【问题讨论】:

  • foreach ($_POST['foodnames'] as $values) $values,在下一行的开关中使用$value
  • 您也在每次循环迭代时清空 $vitcc 数组。您应该使用查找表将2 3/4 字符串预先转换为浮点数。
  • 这个有几个问题,会发布答案来澄清一些

标签: php mysql arrays forms switch-statement


【解决方案1】:

首先,

$vitc = array();
&
$vitcc = array();

两者都需要在你的 foreach 之外(上图),否则它们将在每次迭代中重新创建并且只包含最后一个值。

其次,关于你得到的错误,

return $totalvitcgrams;
&
return $totalvitccups;

这两个也需要在 foreach 循环之外(下)

请记住您使用的变量名,正如 @Sumurai8 在 cmets 中所说,您使用了错误的变量名 $values$value

另外,你需要删除

return $vitc;
&
return $vitcc;

从您的开关结束。

您也可以非常简单地通过执行以下操作来简化此操作:

$vitc = array();
foreach($_POST['foodnames'] as $value){
    $vitc[] = $curRes['mcg100g'] / (100 / $value);
}

不需要这样的 switch 语句。

或者在您的&lt;option&gt; 标签中提供正确的值。该值不必与选项的文本匹配。这也将减轻对这种繁琐开关的需求,并为您留下一个简单的 foreach 循环

【讨论】:

  • 谢谢。 foreach 循环绝对是一种更好的方法。
猜你喜欢
  • 2012-07-26
  • 2011-08-15
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多