Я пытаюсь отсортировать массив файлов изображений с помощью EXIF DateTime Original, заменив исходный код, используемый для сортировки изображений по mtime, используя stat().
Исходный код, используемый для сортировки файлов изображений по mtime, выглядит следующим образом:
// display photos in album
$src_folder = $mainFolder.'/'.$_REQUEST['album'];
$src_files = array_diff(scandir($src_folder ), array('..', '.'));
$files = array();
/*** sort by most recent uploaded file ***/
foreach ($src_files as $key=>$img) {
$stat_folders = stat($src_folder .'/'. $img);
$file_time[$key] = $stat_folders['ctime'];
}
array_multisort($file_time, SORT_DESC, $src_files);
/*** end sort ***/
Я протестировал следующий код, который обеспечивает сортировку массива по мере необходимости:
function getExifDate($filename)
{
$exif_odate = exif_read_data($filename, 0, true);
if ($exif_odate === false){
return filemtime($filename);
}
if (isset($exif_odate['EXIF']['DateTimeOriginal'])){
return strtotime($exif_odate['EXIF']['DateTimeOriginal']);
} else {
return filemtime($filename);
}
}
$src_folder = 'folder/';
$src_files = glob($src_folder . '*.jpg');
array_multisort(array_map('getExifDate', $src_files), SORT_NUMERIC, SORT_DESC, $src_files);
Однако, когда я пытаюсь интегрировать новый метод сортировки, используя следующий код:
// display photos in album
$src_folder = $mainFolder.'/'.$_REQUEST['album'];
$src_files = array_diff(scandir($src_folder ), array('..', '.'));
$files = array();
/*** sort files by date photo taken ***/
function getExifDate(){
global $src_folder, $src_files;
$src_images = array();
foreach ($src_files as $img){
$exif_odate = exif_read_data($img, 0, true);
// $exif_odate = exif_read_data($src_folder . $img, "FILE,COMPUTED,ANY_TAG,IFD0,THUMBNAIL,COMMENT,EXIF", true); <-- doesn't work either!
$src_date = strtotime($exif_odate['EXIF']['DateTimeOriginal']);
$src_images[$img] = $src_date;
}
}
array_multisort(array_map('getExifDate', $src_files), SORT_NUMERIC, SORT_DESC, $src_files);
/*** end sort ***/
Когда страница загружается, для каждого из файлов изображений, которые пытались прочитать, генерируется следующее сообщение об ошибке:
Предупреждение: exif_read_data(): невозможно открыть файл в...
ссылаясь на следующую строку кода:
$exif_odate = exif_read_data($img, 0, true);
Изменение этой строки кода на следующее не имеет значения:
$exif_odate = exif_read_data($src_folder . $img, "FILE,COMPUTED,ANY_TAG,IFD0,THUMBNAIL,COMMENT,EXIF", true);
... и миниатюры изображений отображаются несортированными ... неизбежно.
Любое руководство относительно того, как решить эту проблему, будет оценено по достоинству.
Спасибо за ваше руководство, 04FS. Очень ценю.
Спасибо 04FS за помощь в решении проблемы:
Просто замените следующий исходный код:
/*** sort by most recent uploaded file ***/
foreach ($src_files as $key=>$img) {
$stat_folders = stat($src_folder .'/'. $img);
$file_time[$key] = $stat_folders['ctime'];
}
array_multisort($file_time, SORT_DESC, $src_files);
/*** end sort ***/
с участием:
/*** sort files by date photo taken ***/
foreach ($src_files as $key=>$img){
$exif_odate = exif_read_data($src_folder . '/' . $img, 0, true);
$file_time[$key] = strtotime($exif_odate['EXIF']['DateTimeOriginal']);
}
array_multisort($file_time, SORT_NUMERIC, SORT_DESC, $src_files);
/*** end sort ***/
решил проблему с сортировкой. :)
Действительно ли
$src_folder
имеет косую черту в конце …? В противном случае вам, конечно, нужно было бы вставить это самостоятельно между именем папки и именем файла.