стрипос против глобуса за отключение - PullRequest
0 голосов
/ 03 октября 2018

Я хочу удалить файлы, которых нет в этом массиве.Я знаю имя файла частично, но не знаю суффикс параметра размера после имени файла, например filename-50x75.jpg, filename-100x77.jpg , filename-500x377.jpg.

Я хочу удалить вышеуказанные изображения из каталога и не хочу удалять ниже изображения.

$list_of_allowed_images=array("filename-50x50.jpg","filename-50x70.jpg","filename-90x50.jpg","filename-100x100.jpg","filename-150x150.jpg","filename-250x200.jpg","filename-300x250.jpg","filename-360x270.jpg","filename-390x250.jpg","filename-500x345.jpg","filename-768x576.jpg","filename-820x400.jpg","filename-1024x768.jpg");

У меня есть следующий фрагмент:

foreach(glob($base_path_del.$only_obs_img."[0-9][0-9]*x*.{jpg,gif,png}", GLOB_BRACE) as $file_to_del_now)
{ 
  if(!in_array($file_to_del_now,$list_of_allowed_images))
  {
    unlink($file_to_del_now);       

   }            
} 

, ноЯ думаю, что это может быть более эффективным.Есть ли еще более эффективный способ сделать это?

1 Ответ

0 голосов
/ 03 октября 2018

Вот что я рекомендую:

(непроверенный код)

chdir($base_path_del);
$files = glob($only_obs_img."[0-9][0-9]*x*.{jpg,gif,png}", GLOB_BRACE);
$whitelist_regex = "/-(?:50x[57]0|90x50|100x100|150x150|250x200|300x250|360x270|390x250|500x345|768x576|820x400|1024x768)\.jpg$/i";
$removables = preg_grep($whitelist_regex, $files, PREG_GREP_INVERT);
foreach ($removables as $filename) {
    unlink($filename);       
}

Итак ...

Измените текущий рабочий каталог, чтобы glob() невключите пути в коллекцию подходящих файлов.

Инвертируйте preg_grep(), чтобы сохранить файлы, не соответствующие требованиям регулярного выражения белого списка.

Затем просто зациклите непослушный список и удалитеlot.

Шаблон регулярного выражения сводит логику вашего массива белых списков.Проверка начинается с последнего - в имени файла, проверяет размеры, проверяет .jpg без учета регистра, а затем гарантирует, что имя файла закончилось.

ps или array_map(), если вы не хотитенарушать функциональный стиль.

array_map('unlink', $removables);
...