我有这样的数据:
a|b|c|d|e|f|g
h|i|j|k|l|m|n
o|p|q|r|s|t|u
我可以轻松地使用explode("\n", $data)
来获取所有行的数组(这是一个~4.0GB文件),但现在我想通过使用基于explode()
的多维数组来创建它在垂直管道上。这是我试过的:
$data = explode("\n", './path-to-file.txt');
$results = array_filter($data, function ($el) {
return explode('|', $el);
});
但是,这会产生一维数组,原始行以字符串形式出现。
如何将array_filter()
与回复数组的回调一起使用?
编辑:我可以使用foreach($data as $datum)
并以explode()
的方式执行此操作,但是当我尝试使用时,我使用的内存量大约是内存量的四倍该文件,这是不可取的。这似乎是使用回调函数的绝佳机会,但我似乎无法用array_filter()
执行此操作。
答案 0 :(得分:1)
array_filter()
过滤要包含或排除它们的元素,并希望true
包含要排除的元素或false
。使用array_map()
:
$data = explode("\n", './path-to-file.txt');
$results = array_map(function ($el) {
return explode('|', $el);
}, $data);
更有效的内存方式是逐行读取:
if(($handle = fopen("./path-to-file.txt", "r")) !== false) {
while(($results[] = fgetcsv($handle, 0, "|")) !== false) {}
}