1

我正在检索目录中的照片文件列表并回显到网页中,以便可以为任何相册自动创建该页面。

以下工作正常,但结果是照片不是我喜欢的自然顺序:

<?php
$year = '2021/';
$folder = 'league/';
$n = 1;
$directory = $_SERVER['DOCUMENT_ROOT'].'/events/'.$folder.$year.'images/photos/album/medium';
$numFiles = count(scandir($directory))-2;
$files = new DirectoryIterator($directory);

natsort($files);
foreach ($files as $file) {
if($file->isDot()) continue;
echo '<div class="mySlides">'.PHP_EOL;
echo '<div class="numbertext">'.$n.' / '.$numFiles.'</div>'.PHP_EOL;
echo '<a target="_blank" href="/events/'.$folder.$year.'images/photos/album/large/'.$file->getFilename().'"><img src="/events/'.$folder.$year.'images/photos/album/medium/'.$file->getFilename().'" alt="'.$file->getFilename().'" style="width:100%"></a>'.PHP_EOL;
echo '</div>'.PHP_EOL.PHP_EOL;
$n++;
}

?>

4

3 回答 3

0

natsort 仅适用于字符串数组。

您可以将 natsort 替换为

usort($files, function($a, $b)
{
    return strnatcmp($a->getFilename(), $b->getFilename());
});
于 2021-10-23T22:13:00.810 回答
0
$iterator = new DirectoryIterator($directory);

// Create an array with filenames as key and iterator index as value
$filenames = [];
foreach ($iterator as $index => $item) {
  $filenames[$item->getFilename()] = $index;
}

// Sort the filenames with 'natural compare'
uksort($filenames, static function ($filename1, $filename2) {
  return strnatcmp($filename1, $filename2);
});

// Filter out working directory and parent directory
$filenames = array_filter($filenames, static function ($filename) {
  return $filename !== '.' && $filename !== '..';
}, ARRAY_FILTER_USE_KEY);

// Do something with each DirectoryIterator entry
foreach ($filenames as $filename => $index) {
  $iterator->seek($index);
  ...
  echo $iterator->getFilename() . "\n";
  echo $iterator->getPathname() . "\n";
  etc.
  ...
}
于 2021-10-23T22:37:23.333 回答
0

函数的排序类别仅对数组进行操作,但您可以轻松地将迭代器转换为数组iterator_to_array()。但是,由于DirectoryIterator::current()返回迭代器本身,而不是SplFileInfo每个文件的对象,这将导致不希望的结果。

因此,我的建议是使用FilesystemIterator(which extends DirectoryIterator),因为它更灵活一些,并且默认情况下会current()返回SplFileInfo对象而不是迭代器本身,并且作为奖励也会跳过点。

把这一切放在一起就变成了:

$files = iterator_to_array(new FilesystemIterator($directory));

usort($files, function($a, $b)
{
  return strnatcmp($a->getFilename(), $b->getFilename());
});

foreach($files as $file) {
  echo $file->getFilename() . "\n";
}
于 2021-10-23T23:24:36.473 回答