将 array_filter() 与 returns 数组的回调一起使用

Using array_filter() with a callback that returns an array

我有这样的数据:

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 的文件),但现在我想通过使用 [=15= 使它成为一个多维数组] 基于垂直管道。这是我尝试过的:

$data = explode("\n", './path-to-file.txt');
$results = array_filter($data, function ($el) {
   return explode('|', $el);
});

但是,这会产生一个一维数组,其中原始行为字符串形式。

如何将 array_filter() 与发生在 return 数组上的回调一起使用?

编辑:我可以使用foreach($data as $datum)并以这种方式执行explode(),但是当我尝试那样做时,我使用了大约四倍的量RAM 大于文件的大小,那是不可取的。这似乎是使用回调函数的绝佳机会,但我似乎无法使用 array_filter().

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