Как найти кратчайшее имя (строку) одного и того же изображения с разными именами - PullRequest
0 голосов
/ 06 сентября 2018

У меня проблема, к которой я не знаю, как подойти. У меня есть папка с разными изображениями. Есть разные названия для одних и тех же изображений. Мне нужно найти самый короткий.

Одно изображение может иметь разные имена. Например, как это:

  • clownfish.jpg, clownfish-1024x658.jpg, clownfish-150x150.jpg => нужно найти clownfish.jpg

Другое изображение:

  • b800-768x575.jpg, b800-4.jpg, b800.jpg => Мне нужно найти b800.jpg

И еще одно изображение:

  • agility_3.jpg, agility_3-45x45.jpg => Мне нужно найти agility_3.jpg

Все изображения находятся в одной папке. Как я могу различить эти изображения и выбрать группу одинаковых изображений и найти самое короткое? Извините, но я не знаю, как объяснить это лучше. Есть идеи?

Для этого я буду использовать php.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вы можете использовать функцию levenshtein для сравнения строк и использовать эту функцию, чтобы найти наименьшую похожую строку.
Комментарии в коде ниже.

Вы можете использовать scandir , чтобы получить массив файлов.

$arr= ["clownfish.jpg", "clownfish-1024x658.jpg", "clownfish-150x150.jpg",
"b800-768x575.jpg", "b800-4.jpg", "b800.jpg",
"agility_3.jpg", "agility_3-45x45.jpg"];

foreach($arr as $key => $item){
    foreach($arr as $key2 => $item2){
        if($key != $key2){// make sure we don't compare the same items
            $length = min(strlen($item), strlen($item2))-4; // lenght of the smallest string - ".jpg"
            if(levenshtein(substr($item,0,$length), substr($item2,0,$length), 1,1,0) == 0){ //is it the same file 
                $len = [strlen($item) => $item, strlen($item2) => $item2]; // make a associative array with lenght as key
                $minkey = min(array_keys($len)); // find the smallest of them
                $new[] = $len[$minkey]; // add the smallest to the new array
            }
        }
    }
}

var_dump(array_unique($new)); // remove duplicates

Вывод вышеуказанного

array(3) {
  [0]=>
  string(13) "clownfish.jpg"
  [4]=>
  string(8) "b800.jpg"
  [8]=>
  string(13) "agility_3.jpg"
}

https://3v4l.org/q52vs


Ниже в комментариях кажется, что OP хочет искать файл, если не найден, найти оригинальное имя из папки.

$find = "clownfish-1024x658.jpg";

var_dump(in_array($find, $arr)); // does file exist in array
foreach($arr as $key => $item){
    $length = min(strlen($item), strlen($find))-4; // lenght of the smallest string - ".jpg"
    if(levenshtein(substr($item,0,$length), substr($find,0,$length), 1,1,0) == 0){ //is it the same file 
        $len = [strlen($item) => $item, strlen($find) => $find]; // make a associative array with lenght as key
        $minkey = min(array_keys($len)); // find the smallest of them
        $new[] = $len[$minkey]; // add the smallest to the new array
    }
}

var_dump(array_unique($new)); 

https://3v4l.org/HRKMa

0 голосов
/ 06 сентября 2018

Давайте посмотрим, во-первых, давайте извлечем все изображения из отсортированного каталога.

files = sorted(os.listdir(images))

Что произойдет, так это то, что файлы с самым коротким из них будут на первом месте. Например, b800-768x575.jpg, b800-4.jpg, b800.jpg теперь будет отсортирован в следующем порядке:

b800.jpg, b800-4.jpg, b800-768x575.jpg

Чтобы найти все группы с самой короткой группой, мы проведем итерацию.

select = files[0]
shortest = [select]
for file in files:
    if select in file:
        continue
    else:
        select = file
        shortest.append(select)

shortest теперь будет содержать необходимые файлы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...