@Korneliy

Как удалить файл при условии, что нет одного из одноименных с другим расширением?

Надо удалить из папки файл .webp при условии, что в ней нет файла с тем же названием, но с одним из этих вариантов расширений: png,jpg,jpeg,PNG,JPG,JPEG
Сижу, ломаю голову.

Построил такую конструкцию:

foreach (glob('/dir/*.webp', GLOB_BRACE) as $rext) 
{
$webpext = str_replace('.webp','',$rext).'.png' || str_replace('.webp','',$rext).'.jpg' || str_replace('.webp','',$rext).'.jpeg' || str_replace('.webp','',$rext).'.PNG' || str_replace('.webp','',$rext).'.JPG' || str_replace('.webp','',$rext).'.JPEG';
if (!file_exists($webpext))
{
// пока проверяю на var_dump вместо unlink($webpext);
var_dump($webpext);
}
}


Выдает вот такое:

bool(true) bool(true) bool(true) bool(true)

Пробовал так:

$png = str_replace('.webp','',$rext).'.png';
$jpg = str_replace('.webp','',$rext).'.jpg';
$jpeg = str_replace('.webp','',$rext).'.jpeg';
$pnga = str_replace('.webp','',$rext).'.PNG';
$jpga = str_replace('.webp','',$rext).'.JPG';
$jpega = str_replace('.webp','',$rext).'.JPEG';
if (!file_exists($png) || !file_exists($jpg) || !file_exists($jpeg) || !file_exists($pnga) || !file_exists($jpga) || !file_exists($jpega) )
{
//unlink($rext);
var_dump($rext);
}


Выдает имена файлов webp. Без разницы - имеется рядом там с тем же именем картинка или нет...
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
delphinpro
@delphinpro
frontend developer
Читаем все файлы в массивы.
Натравливаем на них функцию array_diff
Удаляем то , что вернула функция.

spoiler
$webp = glob('*.webp');
$jpg = glob('*.jpg');
$gif = glob('*.gif');

// …тут отрезаем у всех расширения, или далее используем array_udiff со своим коллбеком сравнения

$result = array_diff($webp, $jpg, $gif);

foreach $result as $file {
  unlink($file.'.webp')
}


UPD:

// Читаем все файлы
$files = glob(__DIR__ . '/images/*.*');

// Фильтруем WEBP файлы в массив
$webp = array_filter($files, function ($f) {
  return pathinfo($f, PATHINFO_EXTENSION) == 'webp';
});

// Фильтруем остальные картинки в другой массив
$other = array_filter($files, function ($f) {
  $extensions = ['jpg', 'gif', 'png']; // Перечисляем, какие там еще файлы есть
  return in_array(pathinfo($f, PATHINFO_EXTENSION), $extensions);
});

// В обоих массивах оставляем только имена файлов
$webp2 = array_map(function ($f) { return pathinfo($f, PATHINFO_FILENAME); }, $webp);
$other2 = array_map(function ($f) { return pathinfo($f, PATHINFO_FILENAME); }, $other);

// Вычисляем различия в массивах
$result = array_diff($webp2, $other2);

// Смотрим результат
foreach ($result as $file) {
  var_dump($file.'.webp');
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега PHP
Вот ведь любители извращений
foreach (glob('/dir/*.webp') as $f) {
    $filename = pathinfo($f, PATHINFO_FILENAME);
    if (count(glob('/dir/$filename.*')) == 1) {
        только один, можно удалять
    }
}


по уму конечно надо прочитать все файлы за раз и потом сгруппировать по имени, но от такого сложного алгоритма у бедняги ум за разум зайдет, надо его пожалеть
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы