如何使这个csv读取php代码更高效
好的,下面的代码读取一个csv文件,然后以HTML表格的形式输出结果:如何使这个csv读取php代码更高效,php,html,csv,performance,fgetcsv,Php,Html,Csv,Performance,Fgetcsv,好的,下面的代码读取一个csv文件,然后以HTML表格的形式输出结果: $fhdrop = fopen("ac.csv", "r"); while (!feof($fhdrop) ) { $at[] = fgetcsv($fhdrop, 1024); } $fhdrop2 = fopen("rc.csv", "r"); while (!feof($fhdrop2) ) { $at2[] = fgetcsv($fhdrop2, 1024); } ?> <table bor
$fhdrop = fopen("ac.csv", "r");
while (!feof($fhdrop) ) {
$at[] = fgetcsv($fhdrop, 1024);
}
$fhdrop2 = fopen("rc.csv", "r");
while (!feof($fhdrop2) ) {
$at2[] = fgetcsv($fhdrop2, 1024);
}
?>
<table border=1>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
<td>d</td>
<tr>
<td><?php echo $at[0][0] ?></td>
<td><?php echo $at[0][1] ?></td>
<td><?php echo number_format($at[0][1]*$at2[0][1],2) ?></td>
<td><?php echo number_format($at[0][1]*$at2[1][1],2) ?></td>
</tr>
<tr>
<td><?php echo $at[1][0] ?></td>
<td><?php echo $at[1][1] ?></td>
<td><?php echo number_format($at[1][1]*$at2[0][1],2) ?></td>
<td><?php echo number_format($at[1][1]*$at2[1][1],2) ?></td>
</tr>
<tr>
<td><?php echo $at[2][0] ?></td>
<td><?php echo $at[2][1] ?></td>
<td><?php echo number_format($at[2][1]*$at2[0][1],2) ?></td>
<td><?php echo number_format($at[2][1]*$at2[1][1],2) ?></td>
</tr>
<tr>
<td><?php echo $at[3][0] ?></td>
<td><?php echo $at[3][1] ?></td>
<td><?php echo number_format($at[3][1]*$at2[0][1],2) ?></td>
<td><?php echo number_format($at[3][1]*$at2[1][1],2) ?></td>
rc.csv的内容包括:
a, 5,
b, 10,
c, 24,
d, 21
not, 1.87,
notatall, 1.78
正如您可以从原始代码猜到的,在第二列中,我需要一个乘法。例如,在第二行,第三列,我需要5*1.87和5*1.78。所以基本上是一个“不”和一个“不高”
我的代码效率不高,如何提高效率?我希望所有这些(以某种方式)都进入一个循环。它需要有完全相同的结果,由于复杂性和它有2d数组的事实,我还没有能够做到这一点
<?php
$fhdrop = fopen("ac.csv", "r");
while (!feof($fhdrop) ) {
$at[] = fgetcsv($fhdrop, 1024);
}
$fhdrop2 = fopen("rc.csv", "r");
while (!feof($fhdrop2) ) {
$at2[] = fgetcsv($fhdrop2, 1024);
}
?>
<table border=1>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
<td>d</td>
</tr>
<?php
for ($i = 0; $i < sizeof($at); $i++){
?>
<tr>
<td><?php echo $at[$i][0] ?></td>
<td><?php echo $at[$i][1] ?></td>
<td><?php echo number_format($at[$i][1]*$at2[$i][1],2) ?></td>
<td><?php echo number_format($at[$i][1]*$at2[$i][1],2) ?></td>
</tr>
<?php
}
?>
</table>
A.
B
C
D
注意:我假设$at(ac.csv)和$at2(rc.csv)具有相同的长度。我唯一的建议就是这个
<table>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
<td>d</td>
</tr>
<?php
$fhdrop2 = fopen("rc.csv", "r");
while (!feof($fhdrop2) ) {
$at2[] = fgetcsv($fhdrop2, 1024);
}
$fhdrop = fopen("ac.csv", "r");
while (!feof($fhdrop) ){
$at = fgetcsv($fhdrop, 1024);
?>
<tr>
<td><?php echo $at[0]; ?></td>
<td><?php echo $at[1]; ?></td>
<td><?php echo number_format($at[1]*$at2[0][1],2); ?></td>
<td><?php echo number_format($at[1]*$at2[1][1],2); ?></td>
</tr>
<?php
}
?>
</table>
A.
B
C
D
这不应该优化速度,但应该为更大的ac.csv文件节省一些内存,因为您不需要创建大数组。但我不认为你可以在这里优化速度。我希望有人能提供更好的答案
编辑#01
这里有一个更灵活的循环
<tr>
<td><?php echo $at[0] ?></td>
<td><?php echo $at[1] ?></td>
<?php for($i = 0; $i < sizeof($at2); $i++){ ?>
<td><?php echo number_format($at[1]*$at2[$i][1],2) ?></td>
<?php } ?>
</tr>
有了这个,您的rc.csv可以存储2个以上的值进行乘法。不是速度或内存优化,但如果您尝试扩展函数/循环,则可以节省代码和时间
编辑#02
我尝试了scrowler的方法,并建议采用这种方法,因为逻辑/标记分离。副作用是更多地使用内存和稍微慢一点的脚本速度,但这并不重要(速度)
希望这会有所帮助好的,我将从一些我认为非常重要的概念开始 首先,您需要将CSV文件转换为某种结构化数据格式(CSV可以使用分割值数组)。我将使用PHP的
str_getcsv()
实现这一点。这个函数应该在一个循环中调用,因为它接受一个字符串并将其拆分为一个数组
其次,我坚信您应该在输出数据之前完成所有逻辑工作。这样,您的输出代码就可以保持干净,并且易于查看(您或其他人)。所以我将在输出之前进行逻辑运算,只使用一个简单的输出数组
因此,我首先在阵列中重新创建CSV文件:
$csv_file_1 = array(
'a, 5,',
'b, 10,',
'c, 24,',
'd, 21'
);
$csv_file_2 = array(
'not, 1.87,',
'notatall, 1.78'
);
在您的例子中,您希望将CSV文件读入数组,我建议最好的方法是使用PHP的file()
函数。简单到:
// read csv files into arrays
$csv_file_1 = file('your_first.csv');
$csv_file_2 = file('your_second.csv');
接下来,我想循环第一个数组,从中取出两个变量,然后循环其中的第二个数组,并对第二个原始变量进行计算(我们将调用原始var1
和var2
,以及第二个数组factor\u name
和factor
):
现在,您有一个如下所示的数组:
Array
(
[0] => Array
(
[0] => a
[1] => 5
[2] => 9.35
[3] => 8.9
)
[1] => Array
(
[0] => b
[1] => 10
[2] => 18.7
[3] => 17.8
)
[2] => Array
(
[0] => c
[1] => 24
[2] => 44.88
[3] => 42.72
)
[3] => Array
(
[0] => d
[1] => 21
[2] => 39.27
[3] => 37.38
)
)
这对您是有好处的,因为您现在拥有了结构化的数据以及您想要输出的结果,并且您可以自由地处理这些数据。我将以与你的问题相同的方式输出它。数组上的foreach循环将只输出标题行,然后第二次输出数据行
<table border="1">
<tr>
<? foreach($output as $line) : ?>
<td><?=$line[0]?></td>
<? endforeach; ?>
</tr>
<? foreach($output as $line) : ?>
<tr>
<? foreach($line as $var) : ?>
<td><?=$var?></td>
<? endforeach; ?>
</tr>
<? endforeach; ?>
</table>
文件
我假设$at(ac.csv)和$at2(rc.csv)具有相同的长度
-为什么您会这样假设?他的例子表明,事实并非如此。
<table border="1">
<tr>
<? foreach($output as $line) : ?>
<td><?=$line[0]?></td>
<? endforeach; ?>
</tr>
<? foreach($output as $line) : ?>
<tr>
<? foreach($line as $var) : ?>
<td><?=$var?></td>
<? endforeach; ?>
</tr>
<? endforeach; ?>
</table>
unset($output, $line, $csv_file1, csv_file2);