大型HTML表和PHP循环

大型HTML表和PHP循环,php,Php,我有两个数组,一个包含200个值,另一个包含30个值。我需要制作一个HTML表,每个数组有200行,一个值,数组2中的每行有30列。 守则: <table> <?php foreach ($arrayOne as $arrayOneKey => $arrayOneValue) { ?> <tr> <td><?php echo $arrayOneValue; ?></td>

我有两个数组,一个包含200个值,另一个包含30个值。我需要制作一个HTML表,每个数组有200行,一个值,数组2中的每行有30列。 守则:

<table>
    <?php foreach ($arrayOne as $arrayOneKey => $arrayOneValue) { ?>
    <tr>
        <td><?php echo $arrayOneValue; ?></td>
        <?php foreach ($arrayTwo as $arrayTwoKey => $arrayTwoValue) { ?>
            <td><?php echo $arrayTwoValue; ?></td>
        <?php } ?>
     </tr>
     <?php } ?>
 </table>

这样做的问题是循环需要很多时间,页面加载速度增加了大约200-300毫秒。另外,如果多个用户同时加载,则会增加使用率,从而影响服务器CPU

有没有办法加快速度或以不同的方式制作桌子


谢谢

您是否尝试使用内爆阵列

<table>
    <?php foreach ($arrayOne as $arrayOneValue) {
         echo "<tr><td>$arrayOneValue<td></td>".implode("</td><td>", $arrayTwo)."</td></tr>";
    ?>            
 </table>

我也遇到了类似的问题,通过在脚本中使用并提供JSON格式的数据,改善了这种情况。我们只查看了表格的一部分,按需渲染,这大大加快了速度。但不确定它是否适用于您的情况(如果您坚持一次显示所有数据,可能不会有多大帮助)

此外,使用Firefox或Chrome工具来评估时间花在哪里:

  • 通过PHP代码生成HTML
  • 将大量数据传输到客户端
  • 在客户端上渲染

根据结果,你应该知道在哪个方面要优化…

编辑:快速结论。。。最快的方法是简单的foreach

我想给你一个新的选择会有帮助。默认情况下,foreach结构为每个迭代复制实例。尝试使用符号和通过引用。我忽略了它是否会更优化,但让我们试着发布结果。 另外,让我给你一个提示,在视图中使用可选的php标记,这样可以提高代码的可读性

例如:

<table>
    <?php foreach ($arrayOne as $arrayOneKey => &$arrayOneValue): ?>
    <tr>
        <td><?=$arrayOneValue?></td>
        <?php foreach ($arrayTwo as &$arrayTwoKey => $arrayTwoValue): ?>
            <td><?=$arrayTwoValue?></td>
        <?php endforeach; ?>
     </tr>
     <?php endforeach; ?>
 </table>

编辑:刚刚找到这个解释和基准测试。通过引用进行定义传递要比简单的foreach慢。检查此链接:

EDIT2:没那么简单。归根结底,这似乎取决于上下文、数据类型和其他因素。我一直在使用这个脚本来测试引用传递的foreach和普通foreach之间的差异。结果给出了最佳的速度正常foreach,所以。。。做你自己的结论

<?php
$n = 1500000;

// Generating test array
$array = array();
$i = 0;
while($i < $n) {
  $array[] = $i++;
}

/**
 * Benchmark 
 */



// While
$time_start = microtime(true);
$i = 0;
$length = count($array);
while($i<$length) {
  $devnull = $array[$i++];
}
$time_end = microtime(true);
$time_while = $time_end-$time_start;
echo number_format($time_while, 3, '.', '')
  ." seconds - while()\n";


echo "<br>";


// Foreach
$time_start = microtime(true);
foreach($array as $a) {
  $devnull = $a;
}
$time_end = microtime(true);
$time_foreach = $time_end-$time_start;
echo number_format($time_foreach, 3, '.', '')
  ." seconds - foreach()\n";


echo "<br>";


// Foreach
$time_start = microtime(true);
foreach($array as &$a) {
  $devnull = $a;
}
$time_end = microtime(true);
$time_foreach = $time_end-$time_start;
echo number_format($time_foreach, 3, '.', '')
  ." seconds - ref-foreach()\n";



echo "<br>";


// For
$time_start = microtime(true);
$length = count($array);
for($i=0;$i<$length;++$i) {
  $devnull = $array[$i];
}
$time_end = microtime(true);
$time_for = $time_end-$time_start;
echo number_format($time_for, 3, '.', '')
  ." seconds - for()\n";

?>


上面的scrpit是这个版本的一个自我修改版本:

“这个问题是循环需要很多时间”——不,它们很可能不需要,6000次循环迭代并没有那么多;更可能的情况是,它正在将生成的输出发送到浏览器,而大多数情况下,浏览器都需要渲染它。尤其是渲染大型表格时,表现不佳,因为浏览器必须计算每个表格单元格内容的尺寸,以便知道如何布局整个表格。如果您可以预先设置表格单元格的宽度,并为表格指定
表格布局:fixed
,那么您可能会加快速度。此外,CBroe关于固定列宽的说法是正确的,这对我也有很大帮助(对于Datatables也是可行的)。