4

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

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

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

浏览器中的表单捕获

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

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

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

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



第 1 步)如果差不多完成了,那里没有戏剧

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

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




同样重要的是要注意:

A)提交表单时并非所有行都需要填写;尽管需要完成单个行

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



我一直在玩一些我在这篇文章中找到的代码,使用foreach()来自这篇文章

这是我弗兰肯斯坦一起编写的代码,它返回 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()我几乎无处可去。不好意思长了,想画个好图

4

4 回答 4

0

尝试这个:

$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 />";
    }
}
于 2013-05-31T07:42:02.303 回答
0

也许像这样?

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++;
    }
}
于 2013-05-31T07:45:37.360 回答
0

您提到您不想使用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);
?>
于 2013-05-31T07:48:40.070 回答
0

但我还需要在 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'])来看看你从中得到了什么数据结构。

于 2013-05-31T07:56:05.137 回答