【问题标题】:Multiple File Exists Checking? A Better way?多个文件存在检查?更好的方法?
【发布时间】:2011-06-13 19:15:15
【问题描述】:

我有一个脚本。它接收一个名为 $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';
}

一定有比这更好的方法...有人有什么想法吗?

【问题讨论】:

    标签: php file-exists


    【解决方案1】:
    $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";
    

    【讨论】:

    • 关于这个的事情是我担心性能...... array_filter 会在每个结果上运行 file_exist 函数。如果第一个结果有效,则没有理由运行其他结果……这只是浪费资源。
    • 好吧...你最后做的循环是完美的。除了我只是将其更改为if (file_exists(stuff)) { $img = stuff; break; } 之外,其他所有内容都是多余的。
    【解决方案2】:

    最紧凑(因此不推荐)的形式是:

    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", ...) 这样的地图。所以它不会那么短。

    【讨论】:

    • 关于这个的事情是我担心性能...... array_map 会在每个结果上运行 file_exist 函数。如果第一个结果有效,则没有理由运行其他结果……这只是浪费资源。
    • @JasonAxelrod,确实是浪费处理。不确定这是否是可衡量的性能影响。您必须使用 xdebug/cachegrind 对其进行测试。如果这是一个经常检查的条件,那么您绝对应该使用您的原始代码。
    【解决方案3】:
    $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...
    }
    

    【讨论】:

    • 接缝好像我没听懂...但那是因为你没有解释好!您的问题中有 file_exists 函数,这意味着您正在检查文件是否存在......所以您尝试检查字符串是否包含 image.jpg、gif、png 或其他内容,如果它不返回 random.png?
    【解决方案4】:

    好的...这是我最终确定的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2019-11-02
      相关资源
      最近更新 更多