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