Търсене на файл по сходно име и изтриване след RecursiveInteratorIterator

Ticketa

Registered
Привет,
нещо бъгнах :D

Търся в директория файлове по име (и техните сходни):
/var/www/html/2022/11/chunks/aaee89d8b28920ad1f2780fd09a4a212a64a96a97397f80bd1a8a14eca5e7220.txt
/var/www/html/2022/11/aaee89d8b28920ad1f2780fd09a4a212a64a96a97397f80bd1a8a14eca5e7220_240p_converted.mp4
/var/www/html/upload/photos/2022/11/aaee89d8b28920ad1f2780fd09a4a212a64a96a97397f80bd1a8a14eca5e7220.png
/var/www/html/upload/photos/2022/11/aaee89d8b28920ad1f2780fd09a4a212a64a96a97397f80bd1a8a14eca5e7220_01.png
/var/www/html/upload/photos/2022/11/aaee89d8b28920ad1f2780fd09a4a212a64a96a97397f80bd1a8a14eca5e7220_01.png

Искам да ги изтрия всичките сходни по име файлове

Код:
$directory = new RecursiveDirectoryIterator("/var/www/html");
$allowed = array("png", "mp4","txt");
$search_by_name = "aaee89d8b28920ad1f2780fd09a4a212a64a96a97397f80bd1a8a14eca5e7220";

foreach(new RecursiveIteratorIterator($directory) as $file) {

    #print_r($file);
    if(in_array(substr($file, strrpos($file, '.') + 1), $allowed)) {
        echo $file . "<br/> \n";
        
        //delete all similar files
    }

}
 
Който му трябва, решението:
PHP:
$directory = new RecursiveDirectoryIterator("/var/www/html");

$allowed=array("png", "mp4","txt");

$search_by_name = "aaee89d8b28920ad1f2780fd09a4a212a64a96a97397f80bd1a8a14eca5e7220";

foreach(new RecursiveIteratorIterator($directory) as $file) {

    if(false !== strpos($file->getFilename(), $search_by_name)) {
    if(in_array(substr($file, strrpos($file, '.') + 1),$allowed)) {
        echo $file . "<br/> \n";
    }
    }

}
 
Последно редактирано:
Ето и един пример от мен.


PHP:
<?php
$array = [
    'test_',
    'test_3',
    'test',
    'test',
    'proba_test',
    'proba',
];
$names = [];
foreach($array as $key => $name) {
    if (!str_contains($name, '_')) {
        $names[] = $name;
        continue;
    }
    $explode = explode('_', $name) ?? [];
    foreach($explode as $newName) {
        $names[] = $newName;
    }
}
$names = array_count_values($names);
arsort($names);
var_dump($names);
 
Който му трябва, решението:
PHP:
$directory = new RecursiveDirectoryIterator("/var/www/html");

$allowed=array("png", "mp4","txt");

$search_by_name = "aaee89d8b28920ad1f2780fd09a4a212a64a96a97397f80bd1a8a14eca5e7220";

foreach(new RecursiveIteratorIterator($directory) as $file) {

    if(false !== strpos($file->getFilename(), $search_by_name)) {
   [CODE] if(in_array(substr($file, strrpos($file, '.') + 1),$allowed)) {
echo $file . "<br/> \n";
}
}

}[/CODE]
$file не дава ли информация и за типа файл и да спестиш това
substr($file, strrpos($file, '.') + 1)
 
Иползвай RecursiveCallbackFilterIterator за филтриране.

PHP:
// Флаговете, ако искаш ги слагай
$dir = new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS | FilesystemIterator::FOLLOW_SYMLINKS);

$filter = new RecursiveCallbackFilterIterator(
        $dir,
        function (SplFileInfo $current, $key, $iterator) {
            if ($iterator->hasChildren()) {
                return true;
            }

            $ext = strtolower($current->getExtension());
            $isAllowedExt = in_array($ext, ['png', 'mp4', 'txt']);
            $filenameMatchFound = strpos($current->getFilename(), $search_by_name) !== false;

            if ($current->isFile() && $isAllowedExt && $filenameMatchFound) {
                return true
            }

            return false;
        }
    );

$recursiveIterator = new RecursiveIteratorIterator($filter);
foreach ($recursiveIterator as $file) {
    // ...
}

Така е по-ефикасно понеже ще итерираш през доста по-малко резултати (само тези, които отговарят на филтъра ти).
 

Back
Горе