0

我什至不确定我是否尽可能高效地编写这段代码,但我被困住了,需要帮助......

HTML

<?php
    echo outputDirArray($dir_array, 0, '');
?>

在 PHP 中,我有一个函数可以将我的目录放入一个数组中:

function dirToArray($dir) {
$result = array();
$cdir = scandir($dir);

foreach ($cdir as $key => $value) {
    if (!in_array($value,array('.','..'))) {
        if (is_dir($dir . DIRECTORY_SEPARATOR . $value)) {
            $result[$value] = dirToArray($dir . DIRECTORY_SEPARATOR . $value);
        } else {
            $result[] = $value;
        }
    }
}
return $result;
} //Thanks to someone on this site for this function

然后我获取该数组并将其传递给另一个函数以按照我需要的方式输出它:

function OutputDirArray(&$arr, $x, $origName) {
$str;
foreach ($arr as $key => $value) {
    if($x == 0) $origName = $key;

    if (is_array($value)) {
        if($x > 0) $str .= '</div>';
        $str .= '<div class="infoDiv clearfix"><span class="title">'.$key.'</span><br/>'.OutputDirArray($value, ++$x, $origName).'</div>';
        --$x;
    } else {
        if($x > 0) {
            $str .= '<div class="displayImgs"><img src="images/'.$origName.'/'.$value.'"/></div>';
        } else {
            $str .= '<div class="infoDiv clearfix"><span class="title">Profile Picture</span>
                    <div class="displayImgs"><img src="images/'.$value.'"/></div></div>';
        }
    }
}
return $str;

}

我的var_dump($dir_array);输出:

array(3) { [0]=> string(7) "img1.jpg" ["test1"]=> array(4) { [0]=> string(15) "subimg1.gif" [1]=> string(9) "subimg2.png" [2]=> string(9) "subimg3.jpg" ["test3"]=> array(3) { [0]=> string(15) "subsubimg1.gif" [1]=> string(9) "subsubimg2.png" [2]=> string(9) "subsubimg3.jpg" } } ["test2"]=> array(3) { [0]=> string(15) "subimg1.gif" [1]=> string(9) "subimg2.png" [2]=> string(9) "subimg3.jpg" } } 

我在这里尝试做的是获取 dir_array 并逐步输出 html 代码。一切似乎都很好,除了两个问题......

1)如果我有一个子目录, $key in<span class="title">'.$key.'</span>输出正确的密钥(在我的例子中,test3)。但是 $origName in<img src="images/'.$origName.'/'.$value.'"/>输出使用的原始密钥(test1)。

</div>2) 我相信由于我的 subsub dir 问题,在 subsub (test3) 输出后我留下了一个额外的。

现在试图解决这个问题已经太久了,所以非常感谢任何帮助。

4

2 回答 2

0

这非常接近你想要的

如果你想让我评论它,我很乐意这样做。

代码预览看起来很不错。

只是一个提示,在开始添加属性之前获取正确的 html。它只会让事情变得更复杂。

<?php
    function dirToArray($dir) {
        $result = array("name" => substr($dir, strrpos($dir, "\\") + 1), "children" => array());
        foreach(scandir($dir) as $key => $value) {
            if (!in_array($value,array('.', '..'))) {
                if (is_dir($dir . DIRECTORY_SEPARATOR . $value)) {
                    $result["children"][] = dirToArray($dir . DIRECTORY_SEPARATOR . $value);
                } else {
                    $result["children"][]["name"] = $value;
                }
            }
        }
        return $result;
    }

    function OutputDirArray($arr, $origName = ".", $tab = "") {
        $str = "$tab<div>$origName</div>";
        for($i = 0; $i < count($arr["children"]); $i++) {
            $child = $arr["children"][$i];          
            $name = $child["name"];         
            $path = $origName . DIRECTORY_SEPARATOR . $name;
            if ($child["children"]) {
                $str .= "\n$tab<div>\n" . OutputDirArray($child, $path, "$tab\t") . "\n$tab</div>";
            } else {
                $str .= "\n$tab<div><img src=\"images\\$path\"/></div>";
            }
        }
        return $str;
    }

    echo outputDirArray(dirToArray("path\\to\\file"), "path\\to\\file");
?>
于 2013-07-31T02:45:50.433 回答
0

在你的函数中,你有这个:

if($x == 0) $origName = $key;

我假设这仅在您处于零级时才将原始名称设置为键,因为$x已传入。由于我不确定您在这里到底要做什么,所以我不确定解决方案应该是什么,但我的猜测是你应该检查传入的值或其他东西而$key不是.$origName$x

于 2013-07-31T02:20:18.653 回答