Я хочу превратить список содержимого каталога в массив JSON на PHP (я очень новичок в PHP).Я знаю, что это работает:
// this code works
$base_dir = './posts/';
$directory_iterator = new Directoryiterator($base_dir);
$file_array = [];
foreach($directory_iterator as $file) {
if(!$file->isDot()) {
$file_array[] = $file->getFilename();
}
}
echo json_encode($file_array);
Однако я подумал, что было бы более кратким использовать агрегатные функции (фильтровать и затем отображать), а не выполнять итерации по ним.Я бы предположил, что это будет выглядеть примерно так в JavaScript:
// this is what I'd imagine it looks like in JS
Array.from(directory_iterator)
.filter(file => !file.isDot())
.map(file => file.getFilename())
Я пытался использовать iterator_to_array
для преобразования итератора в массив для выполнения агрегатных функций, затем использовать array_filter
и array_map
Примерно так:
// this doesn't work
$file_array = array_map(
function($file) { return $file->getFilename(); },
array_filter(
iterator_to_array($directory_iterator),
function($file) { return !$file->isDot(); })
);
но результат:
Array
(
[0] =>
[1] =>
[2] =>
)
Когда я запускаю var_dump($file->getFilename())
внутри обратного вызова array_filter()
, это дает мне string(0) ""
.Поэтому я предполагаю, что исходное преобразование итератора в массив было неверным.
Что я здесь не так делаю?Не является ли iterator_to_array()
неправильной функцией для преобразования объекта DirectoryIterator
в массив файловых объектов внутри?
Во-вторых, существуют ли функции map и filter, которые являются методами массива, а не принимают массив какаргумент, похожий на JavaScript?Я думаю, что это сделает код чище.