У меня есть такие данные:
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,0 ГБ), но теперь я хочу сделать его многомерным массивом, используя 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()
,
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) {}
}
Других решений пока нет …