我正在從目錄中檢索照片檔案串列并回顯到網頁中,以便可以為任何相冊自動創建頁面。
以下作業正常,但結果是照片沒有按自然順序排列,這是我更喜歡的:
<?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 >'.PHP_EOL;
echo '<div >'.$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="帶有 natsort 的 PHP DirectoryIterator" style="width:100%"></a>'.PHP_EOL;
echo '</div>'.PHP_EOL.PHP_EOL;
$n ;
}
?>
uj5u.com熱心網友回復:
natsort 僅適用于字串陣列。
你可以用 natsort 替換
usort($files, function($a, $b)
{
return strnatcmp($a->getFilename(), $b->getFilename());
});
uj5u.com熱心網友回復:
$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.
...
}
uj5u.com熱心網友回復:
函式的排序類別僅對陣列進行操作,但您可以輕松地將迭代器轉換為陣列iterator_to_array()。然而,由于DirectoryIterator::current()回傳迭代器本身,而不是SplFileInfo每個檔案的物件,這將導致不希望的結果。
因此,我的建議是使用FilesystemIterator(其擴展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";
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/334767.html
上一篇:json編碼特定物件的屬性
