将 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) {}
}
我有这样的数据:
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) {}
}