什么才算“更好”?
您可以使用正则表达式拆分使其更加健壮,但如果您可以控制源 CSV,则不必担心脏数据。
我看到的一个明显的优化是缓存 count() 结果。
采用:
for ($i = 1, $c=count($txtArray); $i < c - 1); $i++)
代替:
for ($i = 1; $i < (count($txtArray) - 1); $i++ )
每次调用 count() 时,它都会重新计算结果。进行一次计算就足够了,因此您只需保存结果。
我不明白你为什么需要:
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 < $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(即固定数量的行/列。
我所做的只是应用一些简单(和常见)的优化来减少不必要的计算次数。很基本的东西,你会在一段时间后习惯看到。