0

我在下面有两个功能

function ListFiles($dir) {
    if($dh = opendir($dir)) {
        $files = array();
        $topics = array();
        $inner_files = array();
        while($file = readdir($dh)) {
            if($file != "." && $file != ".." && $file[0] != '.') {
                array_push($topics, $file);
                if(is_dir($dir . "/" . $file)) {
                    $inner_files = ListFiles($dir . "/" . $file);
                    if(is_array($inner_files)) $files = array_merge($files, $inner_files);
                } else {
                    array_push($files, $dir . "/" . $file);
                }
            }
        }
        closedir($dh);
        $topics = array();
        $i = 0;

        foreach ($files as $file) {
//wrong result
            $topics[] = getTopicFromPath($file);

//correct result
//$topics[] = getTopicFromPath("/Users/Unknown/Sites/sample/training/topic/acq/19ddb673359747ee9095.txt")
        }
        return $topics;
    }
}

function getTopicFromPath($path){
//$path = /Users/Unknown/Sites/sample/training/topic/acq/19ddb673359747ee9095.txt

    $string1 = substr($path,strpos($path,"topic/"));
//$string1 = topic/acq/19ddb673359747ee9095.txt

    $string2 = str_replace("topic/", "", $string1);
//$string2  = acq/19ddb673359747ee9095.txt

    $string3 = strstr($string2, '/', true);
//$string3 = null
//expecting $string3 = 'acq'

    return $string3;;
}

问题是 getTopicFromPath($path) 无法从 readdir() 方法解析字符串。但是如果我放一个纯字符串,结果是正确的。请检查代码是否清楚。

我想要做的是获取文件路径,将其父文件夹保存为主题。

使用另一种方法获取文件可能会解决问题。但我很好奇这些功能有什么问题?

4

1 回答 1

1

主要问题是您的代码需要清理和简化。

1 - 在您的函数 getTopicFromPath() 中,如果string3为 NULL,则在string2中找不到“/” 。也许您在 Windows 下并且您的目录分隔符是 '\' 而不是 '/' ?

要摆脱这些问题,请使用本机DIRECTORY_SEPARATOR常量。

2 - 显然,这个函数试图找到你的文件$path的目录名。那么你最好使用目录相关的功能,避免过于具体的编码。过于具体通常意味着依赖于上下文和脆弱。

无论如何,我会用两行和两种风格重写你的函数:

function getTopicFromPath($path) {
    $dir = dirname($path);
    return substr($dir, strrpos($dir, DIRECTORY_SEPARATOR) + 1);
}

或者

function getTopicFromPath($path) {
    $dir = dirname($path);
    return basename($dir);
}

3 -在递归函数中调用getTopicFromPath() 。许多条目将被处理多次。那是多余的。

您应该将您的过程分为两个独立的步骤:首先检索文件的完整路径,然后修剪它们。您将获得可重用性和稳健性。

4 - 最后,你应该清理你的ListFile()函数:

closedir($dh);
$topics = array();
$i = 0;

$topics = array()意味着上述对该变量的赋值是无用的,因为它们将被重载。

$i在其范围内未使用。

于 2013-05-22T13:46:12.020 回答