php отфильтровать массив имен изображений и показать отсутствующие изображения @2x retina

У меня есть папка с множеством изображений для приложения iPad. Попытка создать автоматический php-скрипт, чтобы проверить, есть ли у всех изображений в папке парный набор изображений без сетчатки и сетчатки. Если изображение на сетчатке отсутствует, отобразите сообщение, в котором говорится что-то вроде: «Отсутствует: $filename», где $filename — это значение... Я коротко о том, как выполнить сравнение массива изображений, захваченных через glob( ):

Сначала я получаю изображения из папки в формате jpg или png:

$images = glob("ipad/{*.jpg,*.png}", GLOB_BRACE);

Теперь я хочу проверить этот массив изображений, чтобы показать отсутствующие наборы изображений @2x... Я читал, что вы можете использовать array_filter, но не совсем понимаю, как это сделать...

Любые идеи, как этого добиться, а затем повторить их с помощью foreach "Missing: $filename"


person estern    schedule 08.05.2013    source источник
comment
Под парой вы имеете в виду, что вы дали одинаковые имена двум изображениям в паре (например, myimg.jpg и myimg-retina. jpg) или хотите выяснить, является ли изображение дубликатом другого изображения большего размера, как бы ни называлось изображение?   -  person Stefano Sanfilippo    schedule 08.05.2013
comment
Да, в основном ищите image.png и смотрите, есть ли аналог [email protected]... Если версия 2x не существует, отобразите имя файла, для которого требуется версия 2x.   -  person estern    schedule 08.05.2013


Ответы (2)


Вы можете использовать следующее:

$path = __DIR__;
$all = glob("$path/*.{jpg,png}", GLOB_BRACE);

$normal = $retina = array();

// Group Images
foreach($all as $v) {
    strpos($v, '@2x') === false and $normal[basename($v)] = $v;
    strpos($v, '@2x') !== false and $retina[basename($v)] = $v;
}

foreach($normal as $image) {
    $v = pathinfo($image);
    $name = $v['filename'] . '@2x.' . $v['extension'];
    if (! isset($retina[$name])) {
        echo "Missing: $name\n";
    }
}
person Baba    schedule 08.05.2013
comment
Это вызывает ошибку Parse: синтаксическая ошибка, неожиданная T_FUNCTION, есть идеи, почему? в строке кода $normal = ... - person estern; 08.05.2013
comment
Какую версию PHP вы используете? - person Baba; 08.05.2013
comment
Вот почему... PHP 5.2.17 не поддерживает закрытие... обновил код... но, пожалуйста, обнови версию PHP - person Baba; 08.05.2013

Что-то вроде этого должно делать:

var_dump(array_filter(glob('ipad/{*.jpg,*.png}', GLOB_BRACE), function ($file) {
    $info = pathinfo($file);
    return !preg_match('/@2x$/', $info['filename'])
        && !file_exists("$info[dirname]/$info[filename]@2x.$info[extension]");
}));
person deceze♦    schedule 08.05.2013