Проверка наличия нескольких файлов?Лучший способ? - PullRequest
5 голосов
/ 22 января 2011

У меня есть скрипт. Он получает переменную с именем $ node, которая является строкой; сейчас давайте предположим, что значением переменной является «NODEVALUE». Когда скрипт вызывается, он берет переменную $ node и пытается найти изображение с именем NODEVALUE.png. Если он не может найти это изображение, он проверяет NODEVALUE.jpg, если он не может найти, что ищет NODEVALUE.gif ... и после всего этого он все равно не может найти, он возвращает RANDOM.png.

Сейчас я делаю этот скрипт следующим образом:

if (file_exists($img = $node.".png")) {  }
else if (file_exists($img = $node.".jpg")) {  }
else if (file_exists($img = $node.".gif")) {  }
else
{
    $img = 'RANDOM.png';
}

Должен быть лучший способ, чем этот ... у кого-нибудь есть идеи?

Ответы [ 4 ]

3 голосов
/ 22 января 2011
$list = array_filter(array("$node.png", "$node.jpg", "$node.gif"), 'file_exists');
if (!$img = array_shift($list)) {
    $img = 'RANDOM.png';
}

Альтернативы:

$list = scandir(".");
$list = preg_grep("#".preg_quote($node,'#')."\.(jpg|png|gif)$#", $list);

Возвращает список имен файлов, начинающихся с $ node и суффикса .jpg, .png или .gif.

Если в каталоге много записей, возможно, быстрее будет сначала использовать glob ():

$list = glob("$node.*"); // take care to escape $node here
$list = preg_grep("#".preg_quote($node,'#')."\.(jpg|png|gif)$#");

preg_grep() также можно заменить на

$list = array_intersect($list, array("$node.png", "$node.jpg", "$node.gif"));

Или с петлей:

$img = null;
foreach(array('png','jpg','gif') as $ext) {
    if (!file_exists("$node.$ext")) continue;
    $img = "$node.$ext"; break;
}
$img = $img ? $img : "RANDOM.png";
2 голосов
/ 22 января 2011
$n_folder="images/nodes/";
$u_folder="images/users/";
     $extensions=array(".png",".jpg",".gif");

foreach ($extensions as $ext)
{
    if (file_exists($n_folder.$node.$ext))
    {
     $img=$n_folder.$node.$ext;
     break;
    }
    elseif (file_exists($u_folder.$node.$ext))
    {
      $img=$u_folder.$node.$ext;
     break;
    }
}

if (!$img)
{
    random image generator script...
}
2 голосов
/ 22 января 2011

Наиболее компактная (и поэтому не рекомендуемая) форма будет:

if (array_sum(array_map("file_exists", array($fn1, $fn2, $fn3)))) {

Может быть также адаптировано для возврата найденного имени файла с использованием array_search:

array_search(1, array_map("file_exists", array($fn1=>$fn1, $fn2=>$fn2)))

Едва читаемый. Обратите внимание, что для этого также требуется карта типа array("$node.png"=>"$node.png", "$node.gif"=>"$node.gif", ...). Так что это было бы не намного короче.

1 голос
/ 22 января 2011

Хорошо ... это то, что я завершил:

$searches = array(
    $folder . "nodes/" . $node . ".png",
    $folder . "nodes/" . $node . ".jpg",
    $folder . "nodes/" . $node . ".gif",
    $folder . "users/" . $user . ".png",
    $folder . "users/" . $user . ".jpg",
    $folder . "users/" . $user . ".gif"
);

foreach ($searches AS $search)
{
    if (file_exists($search))
    {
        $img = $search;
        break;
    }
}

if (!$img)
{
    random image generator script...
}
...