2012-11-16 20 views

回答

3

一個天真方式:

$lines = file('somefile.txt'); 
shuffle($lines); 
$random_lines = array_slice($lines, 0, 10); 

注:這完全忽視了系統資源的考慮。

+0

+我喜歡'這完全忽視系統資源considerations.'一部分...... – Baba

+1

我知道。 **不要在家裏嘗試這個孩子!** –

+0

大聲笑...孩子們喜歡嘗試你要求他們不要做的 – Baba

3

一個更快的解決方案大線

function m1($file) { 
    $fp = fopen($file, "r"); 
    $size = filesize($file); 
    $list = array(); 
    $n = 0; 
    while (true) { 
     fseek($fp, mt_rand(0, $size)); 
     fgets($fp); 
     $pos = ftell($fp); 
     isset($list[$pos]) or $s = trim(fgets($fp)) and $list[$pos] = $s and $n ++; 
     if ($n >= 100) 
      break; 
    } 
    return $list; 
} 



function m2($file) { 
    $lines = file($file); 
    shuffle($lines); 
    $list = array_slice($lines, 0, 100); 
    return $list; 
} 

簡單的基準與接受的解決方案

10000行

Array 
(
    [m1] => 0.013591051101685 <------ M1 Faster 
    [m2] => 0.033689975738525 
) 

100000號線

Array 
(
    [m1] => 0.014040946960449 <------ M1 Faster 
    [m2] => 0.094476938247681 
) 

Full Benchmark Code

File Used

+0

+1爲徹底的答案。 –

+0

謝謝......只是迴應,因爲你說'天真的方式:'在情況下,其他人想要替代更大的文件 – Baba

+0

同意。你的解決方案是他們要走的路。 –

相關問題