使用PHP从textarea数据生成HTML表

使用PHP从textarea数据生成HTML表,php,arrays,html-table,Php,Arrays,Html Table,我想用PHP制作一个表生成器,它将获取textarea表单字段中的每一行,并将每一行计算为一个新的表单元。每个textarea将作为一个新的表列计算 因此,基于下面的HTML表单,它有4个textarea字段,这将导致一个包含4列的表 在每行输入表列行单元格数据 在每行输入表列行单元格数据 在每行输入表列行单元格数据 在每行输入表列行单元格数据 让我在代码中绞尽脑汁有点困难的是,textarea中的每个新行项目都是一个新表行 我的第一个方法是这样的 $tableColumnsData = i

我想用PHP制作一个表生成器,它将获取textarea表单字段中的每一行,并将每一行计算为一个新的表单元。每个textarea将作为一个新的表列计算

因此,基于下面的HTML表单,它有4个textarea字段,这将导致一个包含4列的表


在每行输入表列行单元格数据
在每行输入表列行单元格数据
在每行输入表列行单元格数据
在每行输入表列行单元格数据
让我在代码中绞尽脑汁有点困难的是,textarea中的每个新行项目都是一个新表行

我的第一个方法是这样的

$tableColumnsData = isset($_POST['table-column'])?$_POST['table-column']:"";

foreach($tableColumnsData as $columnKey => $columns){

    // turns each new line in textarea into array item
    $columnRowItems = explode("\n", str_replace("\r", "", $columns));

    // $columnRowItems now holds each row item for that column in an array

    // this is where my logic breaks
    // I need to generate a table row and populate the 4 columns on each row
    // instead my code makes a new column for each items in textarea 
    // and only 4 rows instead of 4 columns and unlimited rows

    echo '<tr>';
    foreach($columnRowItems as $tkey => $tval){
        echo '<td>'.$tval.'</td>';
    }
    echo '</tr>';
}
echo '</table>';
$tableColumnsData=isset($\u POST['table-column'])?$\u POST['table-column']:“”;
foreach($tableColumnsData作为$columnKey=>$columns){
//将textarea中的每一新行转换为数组项
$columnRowItems=explode(“\n”,str_replace(“\r”,”,$columns));
//$columnRowItems现在保存数组中该列的每个行项目
//这就是我的逻辑断裂的地方
//我需要生成一个表行并填充每行上的4列
//相反,我的代码为textarea中的每个项目创建一个新列
//只有4行,而不是4列和无限行
回声';
foreach($columnRowItems作为$tkey=>$tval){
回声“.$tval.”;
}
回声';
}
回声';
如何重新编写PHP,使其按照我描述的方式工作

每个textarea字段都是一个表列


textarea上的每一行都是该列中的新行

我现在可以用这段代码工作了……不过欢迎改进

<?php
if(isset($_POST['table-column'])) {

  $tableColumnsData = $_POST['table-column'];

  $columnCounts = array();
  $tableDataArray = array();

  echo '
  <table border="1">
    <thead>
      <tr>';
  // get count of rows from each column to determine highest number so our 
  // table will have this many rows
  foreach($tableColumnsData as $columnKey => $rows){
      echo "<th>$columnKey</th>";
      $columnRowData = explode("\n", str_replace("\r", "", $rows));
      $columnCounts[] = count($columnRowData);
      $tableDataArray[] = $columnRowData;
  }

  $numberOfTableColumns = count($tableColumnsData);
  $numberOfTableRows = max($columnCounts);


  echo '</tr>
    </thead>
    <tbody>';
  for ($rowCounter = 0; $rowCounter < $numberOfTableRows; $rowCounter++) {
      echo '<tr>';
      for ($columnCounter = 0; $columnCounter < $numberOfTableColumns; $columnCounter++) {
          if(isset($tableDataArray[$columnCounter][$rowCounter]) && $tableDataArray[$columnCounter][$rowCounter] != ''){
              echo '<td>'.$tableDataArray[$columnCounter][$rowCounter].'</td>';
          }else{
              echo '<td></td>';
          }
      }
      echo '</tr>';
  }
  echo '
    </tbody>
  </table>
  ';

}
?>

<form action="" id="tablegenform" method="post">  
<textarea name="table-column[col1]">
  Enter one row on each line for this table column.
</textarea>
<textarea name="table-column[col2]">
  Enter one row on each line for this table column.
  Here's another Line.
</textarea>
<textarea name="table-column[col3]">
  Enter one row on each line for this table column.
</textarea>
<textarea name="table-column[col4]">
  Enter one row on each line for this table column.
  This is a line.
  Here's another row cell.
</textarea>
<textarea name="table-column[col5]">
  Enter one row on each line for this table column.
</textarea>
<input type="submit">
</form>

为此表列的每行输入一行。
为此表列的每行输入一行。
还有一句话。
为此表列的每行输入一行。
为此表列的每行输入一行。
这是一条线。
这是另一个行单元格。
为此表列的每行输入一行。
此输出中的结果:


col1col2col3col4col5
为此表列的每行输入一行。为此表列的每行输入一行。为此表列的每行输入一行。为此表列的每行输入一行。为此表列的每行输入一行。还有一句话。这是一行。这是另一行单元格。再一次
为此表列的每行输入一行。
为此表列的每行输入一行。
还有一句话。
为此表列的每行输入一行。
为此表列的每行输入一行。
这是一条线。
这是另一个行单元格。
为此表列的每行输入一行。

您能确定每个文本区域输入的行数相同吗?若否:应如何处理此类案件?开始时是空行吗?最后是空行吗?错误消息,根本没有表?我刚刚复制了你的代码,看起来它正在工作。除了缺少一个
echo'',我看不出它有什么问题在顶部。可以肯定的是,每个textarea都是一行,textarea中的每一行都是一列,对吗?@Andrew读着他问题的最后两行,我想应该是相反的-这正是OP似乎遇到的问题。@ccKep哦,我明白了,一开始他说每一行都是一个新的表格单元格,通常意味着列,但现在我仔细阅读了它,我认为你是对的。@ccKep你是对的。我在下面发布了一个新的工作版本的答案。不确定这是否是最好的方式,但它的工作方式,我需要它现在感谢各位。另外,为了回答空项的问题,它只会为这些项生成一个空的表格单元格,这样事情的顺序就保持正确。我真的很想改进这一点,因为我觉得3个循环肯定太多了,但实际上它非常棒。我唯一的贡献是1)将上下文的
$columns
重命名为
$rows
,2)如果表单未发布,则跳过脚本以消除注意事项,3)您声明了
$columnKey
,但从未使用过它,因此我在表单中添加了一个关联索引以与表头一起使用,4)语义完整的带边框的html表,5)将预先填充的文本区域示例数据放在更清晰的位置,6)删除一些未使用的数组。随便rollback@JeffPuckettII谢谢你的反馈。我只是不断地调整它,直到输出看起来正确为止,所以正如你提到的一些好主意一样,肯定还有改进的余地,谢谢。我的最终解决方案还显示了一个带有数字的下拉列表,您只需选择一个数字,然后生成textareas,这样用户就可以使用该数字设置列数,然后每个TextArea的内部将是该列的行。我计划在弹出模式窗口中使用WordPress编辑屏幕中的快捷代码编辑器按钮,通过将表格行数据粘贴到列中快速创建表格
<?php
if(isset($_POST['table-column'])) {

  $tableColumnsData = $_POST['table-column'];

  $columnCounts = array();
  $tableDataArray = array();

  echo '
  <table border="1">
    <thead>
      <tr>';
  // get count of rows from each column to determine highest number so our 
  // table will have this many rows
  foreach($tableColumnsData as $columnKey => $rows){
      echo "<th>$columnKey</th>";
      $columnRowData = explode("\n", str_replace("\r", "", $rows));
      $columnCounts[] = count($columnRowData);
      $tableDataArray[] = $columnRowData;
  }

  $numberOfTableColumns = count($tableColumnsData);
  $numberOfTableRows = max($columnCounts);


  echo '</tr>
    </thead>
    <tbody>';
  for ($rowCounter = 0; $rowCounter < $numberOfTableRows; $rowCounter++) {
      echo '<tr>';
      for ($columnCounter = 0; $columnCounter < $numberOfTableColumns; $columnCounter++) {
          if(isset($tableDataArray[$columnCounter][$rowCounter]) && $tableDataArray[$columnCounter][$rowCounter] != ''){
              echo '<td>'.$tableDataArray[$columnCounter][$rowCounter].'</td>';
          }else{
              echo '<td></td>';
          }
      }
      echo '</tr>';
  }
  echo '
    </tbody>
  </table>
  ';

}
?>

<form action="" id="tablegenform" method="post">  
<textarea name="table-column[col1]">
  Enter one row on each line for this table column.
</textarea>
<textarea name="table-column[col2]">
  Enter one row on each line for this table column.
  Here's another Line.
</textarea>
<textarea name="table-column[col3]">
  Enter one row on each line for this table column.
</textarea>
<textarea name="table-column[col4]">
  Enter one row on each line for this table column.
  This is a line.
  Here's another row cell.
</textarea>
<textarea name="table-column[col5]">
  Enter one row on each line for this table column.
</textarea>
<input type="submit">
</form>