Php 将表行前置到已创建的表

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 (($

我正在从csv构建一个表。当我打开它时,csv格式是未知的,所以我不知道它将生成多少列

我的代码如下所示,工作完美无瑕:

$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循环中生成行
最后一行将这些行组合在一起,并在$buffer中的任何其他行之前插入计数行

根据需要进行调整

$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费埃塔:是的,数组肯定是解决问题的更简洁的方法。创建输出缓冲区是快速解决方案的合理选择,但它确实比在数组中存储行并一次渲染更容易出错。