使用带有返回数组的回调的array_filter()

时间:2017-09-11 19:45:44

标签: php arrays explode array-filter

我有这样的数据:

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()执行此操作。

1 个答案:

答案 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) {}
}