Php 是否存在多个文件检查?更好的方法?

Php 是否存在多个文件检查?更好的方法?,php,file-exists,Php,File Exists,我有剧本。它接收一个名为$node的变量,它是一个字符串;现在,让我们假设变量值为“NODEVALUE”。调用脚本时,它接受变量$node,并尝试查找名为NODEVALUE.png的图像。如果找不到该图像,则检查NODEVALUE.jpg,如果找不到,则查找NODEVALUE.gif。。。在所有这些之后,它仍然找不到,它返回RANDOM.png 现在,我正在按如下方式编写此脚本: if (file_exists($img = $node.".png")) { } else if (file_e

我有剧本。它接收一个名为$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';
}
一定有比这更好的方法。。。有人有什么想法吗

$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()可能会更快:

preg\u 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";
最紧凑(因此不推荐)的形式是:

if (array_sum(array_map("file_exists", array($fn1, $fn2, $fn3)))) {
它还可以调整为使用数组搜索返回找到的文件名:

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

几乎不可读。请注意,它还需要类似于
数组(“$node.png”=>“$node.png”、“$node.gif”=>“$node.gif”、…)的映射。
。所以不会那么短。

好吧。。。这是我最后确定的:

$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...
}
$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...
}

问题是我担心性能。。。数组映射将在每个结果上运行文件存在函数。如果第一个结果有效,就没有理由运行其他结果。。。这只是浪费资源。@JasonAxelrod,这确实是浪费加工。但不确定这是否会对绩效产生可测量的影响。您必须使用xdebug/cachegrind对其进行测试。如果这是一个经常检查的条件,那么你肯定应该继续使用你的原始代码。。。array_filter将对每个结果运行file_exist函数。如果第一个结果有效,就没有理由运行其他结果。。。这只是浪费资源。好吧。。。你在最后做的循环是完美的。除了我简单地将它改为
如果(file_exists(stuff)){$img=stuff;break;}
其他的一切都是重复的。。。但那是因为你没有解释好!您的问题中有file_exists函数,这意味着您正在检查文件是否存在。。。所以,您试图检查字符串是否包含image.jpg、gif、png或其他内容,如果不包含,则返回random.png?
$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...
}