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);
- 1 回答
- 0 关注
- 151 浏览
添加回答
举报