为了账号安全,请及时绑定邮箱和手机立即绑定

函数在 PHP 中不返回任何内容

函数在 PHP 中不返回任何内容

PHP
慕运维8079593 2023-04-02 14:58:04
此功能旨在探索目录和子目录并搜索文件。如果文件名的某个部分与给定的 $unique_code 匹配,那么它应该返回该文件名。但是我的函数在这里什么都不返回。function get_all_directory_and_files($dir, $unique_code, $fileName){     $dh = new DirectoryIterator($dir);        foreach ($dh as $item) {         if (!$item->isDot()) {            if ($item->isDir()) {                get_all_directory_and_files("$dir/$item", $unique_code, $fileName);            }             if ($item->isFile()) {                $without_extension = pathinfo($item, PATHINFO_FILENAME);                $arrData = array();                $arrData = explode("_",$without_extension);                if($arrData[4] == $unique_code){                    $fileName = $item->getFilename();                }            }         }      }      return $fileName;   }get_all_directory_and_files('uploadFiles', $unique_code, "");
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

您如果没有充分利用递归函数。您应该使用由表示的 byref 参数,&或者在递归时应该返回。


这是一个递归示例,它只在找到某些东西时返回,不需要第三个参数。(注意:有深度优先和广度优先搜索,如果你有很多文件和/或目录可能很重要,你应该研究一下。)


function get_all_directory_and_files(string $dir, string $unique_code): ?string

{

    $dh = new DirectoryIterator($dir);

    foreach ($dh as $item) {

        // Move on if this is just a dot file/folder

        if ($item->isDot()) {

            continue;

        }


        if ($item->isDir()) {

            // Capture the return and check it

            $fileName = get_all_directory_and_files($item->getPathname(), $unique_code);

            if ($fileName) {

                return $fileName;

            }

        }


        if ($item->isFile()) {

            $without_extension = pathinfo($item, PATHINFO_FILENAME);

            $arrData = explode("_", $without_extension);

            if (count($arrData) >= 5 && $arrData[4] === $unique_code) {

                // Return if found

                return $item->getFilename();

            }

        }


    }

    return null;

}

这是一个更短的版本,它使用一些本机 PHP 扩展来做同样的事情。可以清理 RegEx,但它应该使您的模式非常明显。


function get_all_directory_and_files(string $dir, string $unique_code): ?string

{

    $di = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);

    $fi = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::SELF_FIRST);

    $unique_code = preg_quote($unique_code, '/');

    $ri = new RegexIterator($fi, "/^[^_]+_[^_]+_[^_]+_[^_]+_${unique_code}(\.|_).*?$/", RecursiveRegexIterator::GET_MATCH);


    $ri->rewind();

    return $ri->current()[0] ?? null;

}

一个不太重复的 RegEx 版本是:


    $ri = new RegexIterator($fi, "/^([^_]+_){4}${unique_code}(\.|_).*?$/", RecursiveRegexIterator::GET_MATCH);



查看完整回答
反对 回复 2023-04-02
  • 1 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信