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

此功能旨在探索目录和子目录并搜索文件。如果文件名的某个部分与给定的 $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, "");


慕运维8079593
浏览 152回答 1
1回答

慕森王

您如果没有充分利用递归函数。您应该使用由表示的 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);
打开App,查看更多内容
随时随地看视频慕课网APP