Использование 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,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(),

0

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector