Php 将表行前置到已创建的表
我正在从csv构建一个表。当我打开它时,csv格式是未知的,所以我不知道它将生成多少列 我的代码如下所示,工作完美无瑕:Php 将表行前置到已创建的表,php,Php,我正在从csv构建一个表。当我打开它时,csv格式是未知的,所以我不知道它将生成多少列 我的代码如下所示,工作完美无瑕: $row = 1; $size = 0; $file = "FileCsv.csv"; if (($handle = fopen($file, "r")) !== FALSE) { echo '<table class="table table-bordered">'; while (($
$row = 1;
$size = 0;
$file = "FileCsv.csv";
if (($handle = fopen($file, "r")) !== FALSE) {
echo '<table class="table table-bordered">';
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
for ($c=0; $c < $num; $c++) {
$array_riga=explode(';',$data[$c]);
$length = count($array_riga);
if($length>$size){$size=$length;}
if($length>1){
echo '<tr><td>'.$row.'</td>';
foreach($array_riga as $cell ){
echo '<td>'.$cell.'</td>';
}
echo '</tr>';
$row++;
}
}
}
echo '</table>';
echo 'column number: '.$size+1; //aggiungo la colonna che ho creato io virtualmente
fclose($handle);
}
$row=1;
$size=0;
$file=“FileCsv.csv”;
if(($handle=fopen($file,“r”))!==FALSE){
回声';
while(($data=fgetcsv($handle,1000,“,”)!==FALSE){
$num=计数($data);
对于($c=0;$c<$num;$c++){
$array_riga=分解(“;”,$data[$c]);
$length=计数($array\u riga);
如果($length>$size){$size=$length;}
如果($length>1){
回显“.$row.”;
foreach($array\u riga作为$cell){
回声“.$cell.”;
}
回声';
$row++;
}
}
}
回声';
echo“列号:”.$size+1;//aggiungo la colonna che ho creato io virtualmente
fclose($handle);
}
只有在这段代码的末尾,我才知道我有多少列。我想做的是在表中添加一行,其中包含一些信息。该行应该是表的第一行。如果我知道最大列数,我会在开始while
之前添加它,但我只在while结束时才知道:每行的列数可能不同(通常在头几行之后会增加)
我知道我可以在呈现表时用js添加它,但我可以用PHP吗?。
这些csv文件来自不同的来源,可能有标题或其他内容,可以改变列的数量。一种解决方案是使用一个简单的缓冲区来存储输出,直到您准备好渲染它为止
- $begin:存储表开始标记
- $end:存储表结束标记
- $buffer:存储旧“echo”语句的输出,并在while/for循环中生成行
$row = 1;
$size = 0;
$file = "FileCsv.csv";
$begin = "";
$buffer = "";
$end = "";
if (($handle = fopen($file, "r")) !== FALSE) {
$begin .= '<table class="table table-bordered">';
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
// $buffer.= "<p> $num fields in line $row: <br /></p>\n";
for ($c=0; $c < $num; $c++) {
$array_riga=explode(';',$data[$c]);
$length = count($array_riga);
if($length>$size){$size=$length;}
if($length>1){
$buffer .= '<tr><td>'.$row.'</td>';
foreach($array_riga as $cell ){
$buffer .= '<td>'.$cell.'</td>';
}
$buffer .= '</tr>';
$row++;
}
}
}
$end .= '</table>';
$end .= 'column number: '.$size+1; //aggiungo la colonna che ho creato io virtualmente
fclose($handle);
}
// I'm using str_repeat to flesh out the rest of the TDs according to your column account.
// This allows us to create a proper first row with the count of rows.
// This prevents a misaligned table. Fix as needed.
$count_row = "<tr><td>$row</td> ". str_repeat("<td></td>", $length) . "</tr>";
echo $begin . $count_row . $buffer . $end;
$row=1;
$size=0;
$file=“FileCsv.csv”;
$begin=“”;
$buffer=“”;
$end=“”;
if(($handle=fopen($file,“r”))!==FALSE){
$begin.='';
while(($data=fgetcsv($handle,1000,“,”)!==FALSE){
$num=计数($data);
//$buffer.=“$num第$row行中的字段:
\n”;
对于($c=0;$c<$num;$c++){
$array_riga=分解(“;”,$data[$c]);
$length=计数($array\u riga);
如果($length>$size){$size=$length;}
如果($length>1){
$buffer.=''.$row';
foreach($array\u riga作为$cell){
$buffer.=''.$cell';
}
$buffer.='';
$row++;
}
}
}
$end.='';
$end.=“列号:”。$size+1;//aggiungo la colonna che ho creato io virtualmente
fclose($handle);
}
//我正在使用stru_repeat根据您的列帐户充实其余的TDs。
//这允许我们使用行数创建正确的第一行。
//这可防止工作台未对齐。根据需要进行修复。
$count_row=“$row”。stru重复(“,$length)。"";
echo$begin$数一数$缓冲区$结束;
有一个简单的解决方案-将数据准备与数据显示分开。使用while
循环创建一个数组,以便稍后在新循环中使用,在新循环中您将呈现表格。当您将数据从模板中分离出来时,可以很容易地插入到您想要的任何位置。”但我只在while的末尾知道它“不是真的——您知道在循环的第一次迭代中,在您输出任何表之前,这正是您想要新行的位置。您已经获得了$num
中的列数,因此只需在计算$num
后输出新行即可,但只需执行一次。您可以通过计算行数(“如果我在第1行,则仅打印新行”)或切换布尔值(“如果我尚未打印新行,则仅打印新行”)@AlexHowansky$num
是我查找代码生成的最大列数时的行数。每行的列数可能会有所不同(通常会在头几行是标题行之后增加)@AlexHowansky数字可能会有所不同。通常,第一行包含较少的列(一些标题)。我们讨论的是从不同的家庭银行提取的银行对账单,所以我知道,使用不同的格式,我误解了您的数据是如何构建的。如果您使用的是一个表,那么必须迭代数据两次——一次计算最大列数,然后第二次显示它们。另一种选择可能是使用网格系统而不是表,只输出网格的最大列数的初始行。我不太喜欢字符串连接和操作。这段代码很容易出错。最好是创建一个包含数据的数组,通过推送第一行然后回显该行来操作它。它更容易阅读,也不容易出错,但这是一个有效的方法alternative@Lelio费埃塔:是的,数组肯定是解决问题的更简洁的方法。创建输出缓冲区是快速解决方案的合理选择,但它确实比在数组中存储行并一次渲染更容易出错。