我甚至不确定我是否尽可能高效地编写了这段代码,但我被卡住了,需要帮助。。。
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) 如果我有一个子目录,<span class="title">'.$key.'</span>
中的$key会输出正确的密钥(在我的例子中是test3)。然而,<img src="images/'.$origName.'/'.$value.'"/>
中的$origName输出使用的原始密钥(test1)。
2) 我相信,由于我的子目录问题,在子目录(test3)输出之后,我会留下一个额外的</div>
。
我们花了很长时间才弄清楚这一点,所以我们非常感谢您的帮助。
这非常接近您想要的
如果你想让我评论一下,我很乐意这样做。
代码预览看起来真的很好。
只是一个提示,在开始添加属性之前,请先更正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");
?>
在您的函数中,您有以下内容:
if($x == 0) $origName = $key;
我认为这只会在您处于零级时将原始名称设置为键,因为$x
是传入的。由于我不确定您在这里到底想做什么,我不确定解决方案应该是什么,但我的猜测是,您应该根据传入的$origName
或其他值来检查$key
的值,而不是$x
。