「より良い」とは何ですか?
正規表現分割を使用してもう少し堅牢にすることもできますが、ソース CSV を制御できる場合は、ダーティ データについて心配する必要はありません。
私が目にする明らかな最適化の 1 つは、count() の結果をキャッシュすることです。
使用する:
for ($i = 1, $c=count($txtArray); $i < c - 1); $i++)
それ以外の:
for ($i = 1; $i < (count($txtArray) - 1); $i++ )
count() を呼び出すたびに、結果が再計算されます。計算は 1 回で十分なので、結果を保存するだけです。
なぜ必要なのかわかりません:
if (count($datArray) > 1)
「クリーン」なデータで作業している場合は、行ごとに一定数の値を持つ必要があるため、それらを数えて何もチェックする必要はありません。高速化するために、ヘッダーの行数を数えて行の長さをキャッシュできます。
後:
$hdrArray = explode( "\t", $txtArray[0]);
行う:
$c2 = count($hdrArray);
次に、2 番目の 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 < $c - 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 であると仮定しています (つまり、固定数の行/列.
私が行ったのは、単純な (そして一般的な) 最適化をいくつか適用して、不要な計算の数を削減したことだけです。しばらくすると見慣れるかなり基本的なもの。