作为导入类的一部分,我们使用这个csvToArray函数。过去它运转得很好,但现在它“坏了”。
我们得到一个“允许内存大小为134217728字节耗尽(试图分配78字节)”错误。
private function _csvToArray($filename='', $delimiter=',')
{
if(!file_exists($filename) || !is_readable($filename))
return FALSE;
$header = NULL;
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE)
{
while (($row = fgetcsv($handle, 0, $delimiter)) !== FALSE)
{
if(!$header)
$header = $row;
else
$data[] = array_combine($header, $row); // THIS IS THE LINE WHERE THE ERROR OCCURS
}
fclose($handle);
}
return $data;
}这可能意味着文件变得很大,但是自从我们开始使用这个脚本之后,它只增加了5行.
发布于 2015-04-21 10:27:39
如果将$header行存储一次并用作索引,则需要更少的内存。实际上,表中的每个非标头行都将有一个头字符串的副本作为键。通过将while循环更改为以下内容,您可以将内存使用量减半(几乎):
while (($row = fgetcsv($handle, 0, $delimiter)) !== FALSE)
{
if(!$header) {
$header = $row;
$flipheader = array_flip($header);
}
else
$data[] = $row; // Just the data
}然后引用翻转的标头索引来查找值,如下所示:
$index = $flipheader['columnName']; // if you need to lookup rows by column name
$value = $data[0][$index];如果只需要在格式化输出时使用标头字符串,而不需要查找值,则更简单,因为可以使用数字索引来获取值,并在需要时使用相同的索引来访问$header字符串。在这种情况下,您将不需要$flipheader变量。
https://stackoverflow.com/questions/29769097
复制相似问题