web関連
【PHP】特定のディレクトリ内の連番が振られている画像を順番に出力する方法
ディレクトリ内にある連番画像でところどころ連番が途切れている画像をループで出力しようとしたときの備忘録
やりたいこと
「img_1.jpg~img_500.jpg」というような連番が振られた画像があり、ところどころ番号が切れていたりしてリネームするのもめんどくさいからphpでいいように出力するのが目的
ディレクトリ内の連番画像を番号順に出力する方法
<?php
$dir = './images';// ディレクトリ指定
$filelist = scandir($dir);// ディレクトリ内ファイル等のリストを取得
usort($filelist, "strnatcmp");//配列の順番を変更
$count = count($filelist);// ファイル数をカウントする
for($i=0; $i<$count; $i++){// 中身をfor文で取得
$file=pathinfo($filelist[$i]);
$file_basename=$file["basename"];// ファイル名取得
$file_ext = $file['extension'];// ファイルの拡張子取得
if($file_ext == 'jpg'){//jpgの時出力
echo "<img src='images/".$file_basename."'>";// 画像ファイルを出力
}
}
?>
これで、ディレクトリ内のファイルを全て順番に出力することができる
jpgで条件分岐しているのはscandir()が隠しファイルも取得してしまうので出力されないようにするため
以下は調べていた時の備忘録
phpの配列をソートする関数sort()
配列をソートかけないで出力したら、画像がバラバラに出力されてしまったので調べた
連番にも「1~100」で振ったり「001~100」と桁を合わせて振るパターンがあると思うけど「1~100」で振ると中々うまくいかなかった
昇順:sort($filelist)を使った場合
//思うように並ばない
img_1.jpg
img_101.jpg
img_102.jpg
img_105.jpg
img_109.jpg
img_11.jpg
img_111.jpg
…
//桁を合わせた場合は上手くいく
img_001.jpg
img_003.jpg
img_008.jpg
img_010.jpg
img_012.jpg
img_015.jpg
img_018.jpg
…
自然順:usort($filelist, “strnatcmp”)を使った場合※今回使用した関数
アルファベットと数字が格納されていてもいい感じ並び替えてくれるようになる
//思った通りに並ぶ
img_1.jpg
img_3.jpg
img_4.jpg
img_5.jpg
img_6.jpg
img_7.jpg
img_8.jpg
…
//桁を合わせてもいい感じに並ぶ
img_001.jpg
img_003.jpg
img_004.jpg
img_005.jpg
img_006.jpg
img_007.jpg
img_008.jpg
…
参考
ギャラリーページを作るのにお客さんが画像を選定してくれたんだけど何百枚もあった
全部リネームするのしんどいけど連番になってるからいけるか?という理由で調べた