PHP使用DirectoryIterator调用natsort实现相册照片自然排序问题
问题解决方法
你的排序逻辑不生效的核心原因是:natsort() 仅支持对数组类型执行排序,你传入的 DirectoryIterator 是迭代器对象,排序操作无法对它生效,所以最终输出还是按文件系统默认的顺序排列。
修正后的代码如下:
<?php $year = '2021/'; $folder = 'league/'; $n = 1; $directory = $_SERVER['DOCUMENT_ROOT'].'/events/'.$folder.$year.'images/photos/album/medium'; // 读取目录所有文件并过滤特殊点文件 $files = array_diff(scandir($directory), ['.', '..']); // 执行自然排序 natsort($files); $numFiles = count($files); foreach ($files as $filename) { 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/'.$filename.'"><img src="/events/'.$folder.$year.'images/photos/album/medium/'.$filename.'" alt="'.$filename.'" style="width:100%"></a>'.PHP_EOL; echo '</div>'.PHP_EOL.PHP_EOL; $n++; } ?>
改动说明
- 放弃使用
DirectoryIterator,直接用scandir()读取目录内容后过滤掉.和..两个特殊目录,得到纯文件名数组 - 直接对文件名数组执行
natsort()实现自然排序,会按照文件名里的数字大小顺序排列,符合相册的常规排序预期 - 简化了文件总数的计算逻辑,不需要单独再执行一次
scandir()计数,直接取排序后数组的长度即可
内容的提问来源于stack exchange,提问作者SewerSleuth
相关产品推荐
相关产品推荐

