【问题标题】:Need syntax help using foreach() in an effort to post inputs需要使用 foreach() 的语法帮助来发布输入
【发布时间】:2013-05-26 23:06:33
【问题描述】:

我显然是一名新手编码员,并且我一直在阅读各种帖子以尝试完成以下任务:

我有一个包含大量 <textarea> 输入字段、150 行和三列的表单(它们是 <textarea> 的原因与我不会详细介绍的特殊 javaScript 功能有关,但它必须是<textarea>)。

这是它的外观(但一直到 150 ):

我将表单发布到另一个页面,当然是 PHP,我想做三件事:

1)显示某些参数的摘要(提交日期、总和、计数等)

2)以某种方式使用循环分配与所有 450 个总输入一致的变量

3) 创建、保存并创建一个链接,供用户下载包含数据的 CSV 文件。



第 1 步)如果基本完成,就没有剧情了

第 3 步)我很确定我可以锻炼,因为那里有很多很好的使用 php 编写文件的教程。

第 2 步)是我不知所措的地方。




同样重要的是要注意:

A) 提交表单时并非所有行都需要填写;虽然需要完成一个单独的行

B) 循环中的“发布”(正确的词?)需要限制为仅完成的最大行数。所以我认为直接的for() 循环不会起作用,因为即使为空白,它也会返回所有 150 行。



我一直在使用我在此处使用foreach() 的帖子中找到的一些代码,来自this post

这是我弗兰肯斯坦一起编写的代码,它返回 ok(仅适用于第一列 {让我们称之为 column_A} 并且它受到使用 column_A 作为标尺的填充字段数量的限制。

foreach($_POST as $name => $inputA) {

    if(strpos($name, 'column_A')===0) {
        if($inputA !== ''){
            echo $i , " )" , " " , $inputA , "<br />";
            $i++;
        }
    }
}



因此,如果我用一些数据填写 5 行,那么这段代码将返回:

1) A栏一

2) A 栏二

3) A栏三

4) A 栏四

5) A 栏五



但我还需要在 column_A 旁边回显 column_B 和 column_C。例如:

1) A列一B列一C列一

2) A 列二B 列二C 列二

3) A 列三B 列三C 列三

4) A 列四B 列四C 列四

5) A 列五B 列五C 列五



所以也许 en echo 声明,例如:

echo $i , " )" , " " , $inputA , " " , $inputB, " " , $inputC , "<br />";

我一直在尝试阅读 PHP 手册上的 strpos()for()foreach(),但我几乎无处可去。不好意思长了,想画个好图

【问题讨论】:

    标签: php forms post for-loop foreach


    【解决方案1】:

    但我还需要在 column_A 旁边回显 column_B 和 column_C。

    您应该首先为您的输入字段命名,以便获得更可用的数据结构。

    您可以附加方括号来获取 PHP 中的输入值数组 - 您也可以指定要使用的索引:

    name="field[0][A]"
    name="field[0][B]"
    
    name="field[1][A]"
    name="field[1][B]"
    

    试试看,然后使用var_dump($_POST['field']) 看看你从中得到了什么数据结构。

    【讨论】:

    • 您的意思是在
    • 你不需要,但如果你这样做,你会得到更一致的数据结构,更容易处理。
    • 好的,我和你在一起。我正在使用五行进行测试。现在我有 5 个数组,其中包含 3 个值的嵌套数组,你能指出一些我可以用来应用循环的语句或函数吗?转储输出示例:'array(5) { [1]=> array(3) { ["A"]=> string(12) "321654987654" ["B"]=> string(1) "2" [" C"]=> 字符串(3) "1.5" } [2]=> 数组(3) { ...´
    • 两个嵌套的 foreach 循环应该可以遍历二维数组。
    【解决方案2】:

    试试这个:

    $lt = range('A', 'C');
    foreach ($_POST as $name => $input) {
        foreach ($lt as $i => $letter) {
            echo $i, " )";
            if (strpos($name, 'column_' . $letter) === 0) {
                if ($input !== '') {
                    echo " ", $input;
                }
            }
            echo "<br />";
        }
    }
    

    【讨论】:

      【解决方案3】:

      也许是这样的?

      foreach($_POST as $name => $inputA) {
          $found = false;
          if(strpos($name, 'column_A')===0) {
              if($inputA !== ''){
                  echo $i , " )" , " " , $inputA;
                  $found = true;
              }
          }elseif(strpos($name, 'column_B')===0) {
              if($inputB !== ''){
                  echo " " , $inputB;
                  $found = true;
              }
          }elseif(strpos($name, 'column_C')===0) {
              if($inputC !== ''){
                  echo " " , $inputC;
                  $found = true;
              }
          }
          if($found){
              echo "<br />";
              $i++;
          }
      }
      

      【讨论】:

        【解决方案4】:

        您提到您不想使用for 循环遍历 150 行中的每一行,但我确实认为这是最好的方法。在这种情况下,150 次迭代的循环不是问题。

        您通过POST 的方式让我知道您希望$_POST 数组的顺序与FORM 的顺序一致。现在大多数情况下都是这样,但不能保证。所以我建议不要使用它。

        为了使其正常工作,我会在创建 FORM 时使用行标识符命名列,因此它看起来像

        <form>
        <!--row 1 -->
        <textarea name='row_1_col_a'></textarea>
        <textarea name='row_1_col_b'></textarea>
        <textarea name='row_1_col_c'></textarea>
        
        <!--row 2 -->
        <textarea name='row_2_col_a'></textarea>
        <textarea name='row_2_col_b'></textarea>
        <textarea name='row_2_col_c'></textarea>
        
        <!-- continue with all rows -->
        </form>
        

        您可以通过PHP轻松做到这一点

        <form>
        
        <?php
        for($row=1;$row<=150;$row++) {
          ?>
          <!--row <?php echo $row; ?> -->
          <textarea name='row_<?php echo $row; ?>_col_a'></textarea>
          <textarea name='row_<?php echo $row; ?>_col_b'></textarea>
          <textarea name='row_<?php echo $row; ?>_col_c'></textarea>
          <?php
        }
        ?>
        
        </form>
        

        现在您可以唯一标识每一行的每一列。然后在 PHP 中你可以遍历行。

        <?php
        $completerows = 0;
        for($row=1;$row<=150;$row++) {
          //check the vars for the row. If its empty continue with next row
          //I dont use the empty() method to check incase you need to enter a 0 in one of the columns
        
          //col A
          if (!isset($_POST['row_'.$row.'_col_a']) || strlen($_POST['row_'.$row.'_col_a'])==0)
            continue;
          $colA = $_POST['row_'.$row.'_col_a'];
        
          //col B
          if (!isset($_POST['row_'.$row.'_col_b']) || strlen($_POST['row_'.$row.'_col_b'])==0)
            continue;
          $colA = $_POST['row_'.$row.'_col_b'];
        
          //col C
          if (!isset($_POST['row_'.$row.'_col_c']) || strlen($_POST['row_'.$row.'_col_c'])==0)
            continue;
          $colA = $_POST['row_'.$row.'_col_c'];
        
          //if you are here the entire row is filled.
          //do something with $colA, $colB and $colC
        
          $completerows++;
        }
        
        var_dump($completerows);
        ?>
        

        【讨论】:

        • 我正在努力解决您的问题,但似乎有些不对劲。当我插入解决方案时,我只得到:int(0)。是否应该有一些语句将$completerows 分配给for() $rows 循环?
        • 现在完成行将只为具有 col a、b 和 c 值的行增加。如果其中一个丢失,它将无法正常工作。因此,请确保至少一行发布了所有值
        猜你喜欢
        • 2011-05-04
        • 1970-01-01
        • 2011-11-04
        • 2010-10-10
        • 2022-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多