[英]PHP Get X Amount of Lines from File until Done
我有一個2000行的文本文件,並且需要連續循環一次獲取100行。 我可以使它工作,但是我必須手動更改每個100塊的$ i值。以下是代碼:
$file = 'postcode_2000.txt';
for ($i = 0; $i <= 99; $i++) {
$str = str_replace(PHP_EOL, '', $file[$i]);
$list[] = $str;
}
$list_json = json_encode($list);
我該如何迭代每次獲得下一個100?
將文件放入數組后,可以使用array_chunk()
。 首先將文件讀入數組:
$lines = 'postcode_2000.txt';
然后塊文件放入100個部分:
$chunks = array_chunk($lines, 100, true); // true keeps a set of consecutive line numbers
輸出將是這樣的:
Array
(
[0] => Array
(
[0] => line in file
[1] => line in file
[2] => line in file
[3] => line in file
[4] => line in file
...
[94] => line in file
[95] => line in file
[96] => line in file
[97] => line in file
[98] => line in file
[99] => line in file
)
[1] => Array
(
[100] => line in file
[101] => line in file
[102] => line in file
[103] => line in file
[104] => line in file
...
[194] => line in file
[195] => line in file
[196] => line in file
[197] => line in file
[198] => line in file
[199] => line in file
)
[2] => Array
(
[200] => line in file
[201] => line in file
[202] => line in file
[203] => line in file
[204] => line in file
...
[294] => line in file
[295] => line in file
[296] => line in file
[297] => line in file
[298] => line in file
[299] => line in file
)
...
[18] => Array
(
[1800] => line in file
[1801] => line in file
[1802] => line in file
[1803] => line in file
[1804] => line in file
...
[1894] => line in file
[1895] => line in file
[1896] => line in file
[1897] => line in file
[1898] => line in file
[1899] => line in file
)
[19] => Array
(
[1900] => line in file
[1901] => line in file
[1902] => line in file
[1903] => line in file
[1904] => line in file
...
[1994] => line in file
[1995] => line in file
[1996] => line in file
[1997] => line in file
[1998] => line in file
[1999] => line in file
)
)
如果您真的想使用循環而不是array_chunk :)
<?php
$file = file('/tmp/postcodes_2000.txt');
$list = array();
$line_count = count($file);
$chunk_size = 100;
$current_line = 0;
echo "Line count: ${line_count}" . PHP_EOL;
while( $current_line < $line_count ) {
$i = 0;
$chunk = array();
while($i < $chunk_size) {
$str = str_replace(PHP_EOL, '', $file[$current_line]);
$chunk[] = $str;
echo "> Line ${current_line} : " . $file[$current_line] . PHP_EOL;
$i++;
$current_line++;
}
$list[] = $chunk;
}
$list_json = json_encode($list);
echo $list_json . PHP_EOL;
生成器非常適合當您計算大型集,並且您不想同時為所有結果分配內存,或者當您不知道是否需要所有結果時,由於結果的方式是在處理后,可以僅為當前結果分配內存,從而將內存占用空間降至最低限度。
因此,這是一種非常快速的方法,它消耗更少的內存來實現您的目標:
我們打開文件,讀取精確的行數,然后生成結果,同時保留下一次迭代的狀態,從而使您可以非常快速地處理塊,並減少內存消耗。
進行這種方式的好處是,在允許您最終(第三次)執行以下操作之前,避免兩次讀取所有文件以構建塊(一次讀取以構建包含所有行的大數組,然后循環遍歷該數組以構建塊)。遍歷大塊數組...
function file_get_x_lines($file,$amount=100){
if(!file_exists($file)||!is_file($file)||!is_readable($file))
return;
if(!is_int($amount)||$amount<1) $amount=1;
$handle=fopen($file,'rb');
$i=0;
while($line=fgets($handle)){
if($i===0)
$tmp=array();
$chunks[]=rtrim($line,PHP_EOL);
$i++;
if($i===$amount){
$i=0;
$tmp=$chunks;
$chunks=array();
yield $tmp;
}
}
if(!$line)
yield $chunks;
}
然后就可以像使用任何發電機一樣使用它
foreach(file_get_x_lines(__FILE__) as $list) {
$list=json_encode($list);
//do stuff
}
如果您想保持與行號相同的鍵,則可以通過以下方式輕松更改功能:
function file_get_x_lines($file,$amount=100){
if(!file_exists($file)||!is_file($file)||!is_readable($file))
return;
if(!is_int($amount)||$amount<1) $amount=1;
$handle=fopen($file,'rb');
$i=0;
$j=1;
while($line=fgets($handle)){
if($i===0)
$tmp=array();
$chunks[$j]=rtrim($line,PHP_EOL);
$i++;
$j++;
if($i===$amount){
$i=0;
$tmp=$chunks;
$chunks=array();
yield $tmp;
}
}
if(!$line)
yield $chunks;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.