[英]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的文件),但是现在我想通过使用基于explode()
方法使其成为多维数组在垂直管道上。 这是我尝试过的:
$data = explode("\n", './path-to-file.txt');
$results = array_filter($data, function ($el) {
return explode('|', $el);
});
但是,这将导致一维数组,原始行为字符串形式。
如何在碰巧返回数组的回调中使用array_filter()
?
编辑:我可以使用foreach($data as $datum)
并以这种方式进行explode()
,但是当我尝试这样做时,我使用的RAM量大约是文件大小的四倍,这是不希望的。 这似乎是使用回调函数的绝好机会,但是我似乎无法使用array_filter()
做到这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) {}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.