什麼資格爲「更好」?
您可以使用正則表達式分割使其更健壯,但如果您可以控制源CSV,則不必擔心臟數據。
我看到的一個明顯的優化是緩存count()結果。
用途:
for ($i = 1, $c=count($txtArray); $i < c - 1); $i++)
相反的:
for ($i = 1; $i < (count($txtArray) - 1); $i++)
每次調用計數時間()這是重新計算的結果。做一次計算應該足夠了,所以你只需保存結果即可。
我不明白爲什麼你需要:
if (count($datArray) > 1)
如果您正在使用「乾淨」的數據時,它應該有一個固定的數值,每行,以便對其計數和檢查沒有是不必要的。爲了加快速度,您可以通過計算標題中的行數來緩存行長。
後:
$hdrArray = explode("\t", $txtArray[0]);
務必:
$c2 = count($hdrArray);
然後用它在第二個for循環:
for($j = 0; $j < c2; $j++)
如果你做不得不擔心空行,它可能會更快地搜索一個空行並在循環中跳過它。
像這樣:
// skip the row if the $datArray contains an empty array
if($datArray == array()) {
continue;
}
$heads[$headerNames[$j]] = $datArray[$j];
總之你:
$hdrArray = explode("\t", $txtArray[0]);
$c2 = count($hdrArray);
// it has an iterator variable...
// I don't understand why you wouldn't use a for loop here
$i = 0;
foreach ($hdrArray as $hdr) {
$heads[$hdr] = '';
$headerNames[$i++] = $hdr;
}
for ($i = 1, $c=count($txtArray); $i < c1 - 1); $i++) {
$datArray = explode("\t", $txtArray[$i]);
for($j = 0; $j < c2; $j++)
// skip the row if the $datArray contains an empty array
if($datArray == array()) {
continue;
}
$heads[$headerNames[$j]] = $datArray[$j];
}
}
我假設你的第一個執行工作,以及源數據實際上是CSV(即固定數量的行/列
我所做的只是應用一些簡單的(和普通的)優化以減少不必要的計算次數。漂亮的基本東西,你習慣看後不久。
你的代碼並不真正起作用,你可以包含你正在解析的文件的樣本嗎?由於這是一個技術問題,它更適合堆棧溢出,除非我錯過了某些東西? – yannis 2012-04-27 08:02:25