Php 将数组_filter()与返回数组的回调一起使用

Php 将数组_filter()与返回数组的回调一起使用,php,arrays,explode,array-filter,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

我有这样的数据:

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作为$datum并以这种方式进行分解,但是当我尝试这样做时,我使用了大约四倍于文件大小的RAM,这是不可取的。这似乎是一个使用回调函数的绝佳机会,但我似乎无法使用array\u filter做到这一点。

array\u filter筛选元素以包含或排除它们,并期望true包含元素或false排除元素。使用数组映射:

一种更节省内存的方法是逐行读取:

if(($handle = fopen("./path-to-file.txt", "r")) !== false) {
    while(($results[] = fgetcsv($handle, 0, "|")) !== false) {}
}

我想用数组来代替地图你在用数组做什么?是否可以一次处理一行文件,而不是将其全部读入内存,或者是否需要对其进行排序或其他操作?这不是将文件数据放入一个比文件大小占用更多内存的数组的方法。这是实际阵列本身:这样做时,我使用了约34GB的内存。没有更便宜的方法可以做到这一点吗?添加了另一种方法。fgetcsv甚至比手工进行foreach要慢得多,并且使用了类似数量的RAM。事实上,这个脚本已经执行了11分钟,与实际文件的大小相比,仍然使用了大量内存。但是,array_map是问题的答案,所以谢谢!在fgetcsv解决方案中,您在做什么?解决方案本身根本不需要占用太多内存,除非您只是在内存中构建一个巨大的2d数组,在这种情况下,除非您重新处理使用dataCorrect所做的工作,否则将永远无法摆脱内存陷阱。第二种方法一次只读取一行,但$results数组将变得相当大。
if(($handle = fopen("./path-to-file.txt", "r")) !== false) {
    while(($results[] = fgetcsv($handle, 0, "|")) !== false) {}
}