Php найти файлы с похожим размером файла и удалить самые старые - PullRequest
1 голос
/ 04 апреля 2020

Я пытаюсь найти файлы с точно таким же размером файла и сохранить файл с самым последним размером файла и удалить другие файлы.

Пока я просматриваю все мои файлы и получаю последний измененный файл .

Отредактировал мой код Текущий код удаляет много, но все еще есть 3 файла с одинаковым размером файлов, которые не удаляются корректно (сохранить последний измененный один удалить другие).

$files = glob($currentDir.'\*.jpg', GLOB_NOSORT);

$count = count($files);
$itemsToRemove = [];
for ($i = 0; $i < $count - 1; $i++) {
    for ($j = $i + 1; $j < $count; $j++) {
        // compare $z[$i] with $z[$j]...
        if(filesize($files[$i]) == filesize($files[$j])) {
            if(is_file($files[$j])) {
                $itemsToRemove[] = $files[$j];
            }
        }
    }
}

foreach($itemsToRemove as $item) {
    if(is_file($item)) {
        unlink($item);
    }
}

Но вывод неправильный. Он по-прежнему показывает некоторые дубликаты файлов с точным размером файла. Я думаю, что я сравниваю их неправильно, мне нужно сравнить каждое значение со всеми другими значениями в массиве.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Я не совсем уверен, если это то, что вы хотите, но я надеюсь, что вам поможет : -)

<?php
$files = glob('*.jpg', GLOB_NOSORT);

//Get filetimes and only include unique filetimes (array_unique below)
$filetimes_arr = array_map('filemtime', $files);
array_multisort($filetimes_arr, SORT_NUMERIC, 
SORT_DESC, $files); //latest changed files 0,1...

//This would include only unique filetimes but still having same key as $files
$uniqe_times = array_unique($filetimes_arr); 

/*
example:

($files)
  0 => string 'brannebrona-e1536697041347-144x150.jpg' (length=38)
  1 => string 'brannebrona-e1536697041347-150x150.jpg' (length=38)
  2 => string 'brannebrona-e1536697041347-250x150.jpg' (length=38)
  3 => string 'brannebrona-e1536697041347-288x300.jpg' (length=38)
  4 => string 'brannebrona-e1536697041347-393x311.jpg' (length=38)
  5 => string 'brannebrona-e1536697041347-649x250.jpg' (length=38)
  6 => string 'brannebrona-e1536697041347-649x580.jpg' (length=38)
  7 => string 'brannebrona-e1536697041347.jpg' (length=30)
  8 => string 'brannebrona-e1536696975180.jpg' (length=30)
  9 => string 'brannebrona-e1536696959513.jpg' (length=30)
  10 => string 'brannebrona-1565x580.jpg' (length=24)
  11 => string 'brannebrona-250x150.jpg' (length=23)
  12 => string 'brannebrona-393x311.jpg' (length=23)
  13 => string 'brannebrona-1024x450.jpg' (length=24)
  14 => string 'brannebrona-1180x250.jpg' (length=24)
  15 => string 'brannebrona-150x150.jpg' (length=23)
  16 => string 'brannebrona-150x66.jpg' (length=22)
  17 => string 'brannebrona-300x132.jpg' (length=23)
  18 => string 'brannebrona-768x337.jpg' (length=23)
  19 => string 'brannebrona.jpg' (length=15)

($uniqe_times) (key intact with $files)
  0 => int 1536697041
  8 => int 1536696975
  9 => int 1536696959
  10 => int 1536696759
  13 => int 1536696758
  19 => int 1536696757

  (0-7 has the same filesize)
  (10-12 has the same filesize) 
  (13-18 has the same filesize)

  Go through the unique filesize array 
  and include the actual file you want
 */

 $use_files = array();
foreach($uniqe_times as $key=>$t) {
    $use_files[] = $files[$key];
}

//Go head and use the array $use_files

Файлы, которые вы хотите удалить, - это те, которые вы не хотите использовать ... Поэтому вы можете просто сравнить исходные файлы (массив) с массивом use_files .

Если файл из исходного файла отсутствует в массиве use_files, удалите его.

//Files you don't need (when it's files
//that are not supposed to be used, then delete them)
foreach($files as $f) {
    //If this file doesn't exists in use_files array, then remove
    if (in_array($f, $use_files) === false) {
        $unlink($f);
    }
}
0 голосов
/ 04 апреля 2020

Полагаю, ваша задача может быть решена примерно так:

$curSize = false;
foreach ($files as $file) {
    if ($curSize === false || filesize($file) !== $curSize) {
        $curSize = filesize($file);
    } else {
        unlink($file);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...