Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使这个csv读取php代码更高效_Php_Html_Csv_Performance_Fgetcsv - Fatal编程技术网

如何使这个csv读取php代码更高效

如何使这个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

好的,下面的代码读取一个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 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>

文件

进一步阅读


为什么不把这些都放在一个循环中?这涉及复杂的计算。我如何使两个数组在一个循环中相乘?相乘总是一样的吗<代码>值*不;val*noteatall?在非CPU周期、内存使用或执行速度方面效率高??因为您的代码现在有多快?
我假设$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);