1


「url1」、「info1」、「url2」、「info2」、「url3」、「info3」
のように配置されたファイルがあります
...「url15」、「info15」まで

$pagelist[0][0] が url5 を返し、$pagelist[0][1] が info5 を返すように、ファイルの最後の 10 行を配列に読み込みたいと思います。

私の現在のコードは次のとおりです。

$file=fopen(csvfile.txt,"r");
$pagelist=array();
$i=0;
$key=0;
while (!feof($file)) {
    if ($i >= (count($file)-11)) {
        $pagelist[$key]=fgetcsv($file);
        $key++; }
    $i++;
}
fclose($file)

print_r($pagelist) を使用すると、最後の 10 行だけでなく、ファイルのすべての行が配列に読み込まれたように見えました。ありがとう :)

4

3 に答える 3

3

あなたのコードの問題は、count($file)あなたが思っていることをしていないということです。$file配列ではなく、単なるファイル ハンドル リソースです。を比較することに$i >= -11なりますが、これはもちろん常にtrue/に評価されます

Linux を使用して最後の 10 行を取得したい場合は、次のようにしてみてください (Linux を使用しているかどうかは不明です)。

$initial_csv = 'csvfile.txt';
$truncated_csv ='csvfile_trun';
$number_of_lines_from_end = 10;
shell_exec('tail -n ' . $number_of_lines_from_end . ' ' . $initial_csv . ' > ' . $truncated_csv);
$file=fopen($truncated_csv,"r");
$pagelist=array();
$i=0;
while (!feof($file)) {
    $pagelist[$i]=fgetcsv($file);
    $i++;
}
fclose($file)

あるいは、ファイル全体をメモリに保持してもかまわない場合 (つまり、ファイルが小さいままである場合)、ファイル全体を次のように配列に読み込むことができます。

$csv = 'csvfile.txt';
$number_of_lines_from_end = 10;
$file_array = file($csv);
$line_count = count($file_array);
$start = $line_count - $number_of_lines_from_end - 1;
$pagelist=array();
for ($i = $start; $i < $line_count; $i++) {
    $pagelist[]=fgetcsv($file);
}
于 2012-12-15T00:12:18.710 に答える
0

それを楽しむためのさらに別の実装 (Mike のtailものはおそらく最速です):

$storage  = new SPLFixedArray(10);
$i = 0;
while(($line = fgets($file)) && ++$i) {
    $storage[$i%10] = $line;
}
$storage = $storage->toArray();
//switch if order is important;
$prepend = array_splice($storage,($i%10)+1,10 - ($i%10));
array_splice($storage,0,0,$prepend);
//interpret csv
$result = array_map('str_getcsv',$storage);
于 2012-12-15T00:34:54.743 に答える
-1
$file=fopen(csvfile.txt,"r");    
$pagelist= [];                  
$temp = fgetcsv($file);          
array_merge($pagelist, $temp);   
fclose($file);                              
print_r($pagelist);                         
$lastten = array_slice($pagelist, -10, 10); 
print_r($lastten);

※スライスのオフセットとリミットについては間違っているかもしれません。

于 2012-12-15T00:13:39.317 に答える