我编写了一个获取文件夹所有子文件夹的函数。它还可以选择进入上一级并显示文件夹....就像文件管理器一样,但它只适用于文件夹,并且限制不要高于基本文件夹,以防止用户浏览整个文件夹硬盘。
我将结果作为json对象返回到div中。我的问题是: 在我的Windows框(使用wamp)上,文件夹列表顶部始终显示“Up one Level”文件夹。当我将它上传到我的网站上时,它不会显示在顶部,而是显示在中间的某个位置。我写了一个函数(fixArray($ array))来纠正这个...但它似乎不起作用。提供此功能的整个解决方案,因此请帮助使其工作,并让其他人从中受益。 仅举几说:JS代码没有任何问题。 JSON对象按照php文件发送的顺序进行解析。
function fixPath($path) {
$path = str_replace('/../', '/', $path);
$path = str_replace('/./', '/', $path);
return $path;
}
function fixArray($array) {
for($i = 0; $i < count($array); $i++) {
if(!strcmp($array[$i]['name'],"Up one Level")) {
$aux = $array[$i];
$array[$i] = $array[0];
$array[0] = $array[$i];
break;
}
}
}
function directoryList($basepath, $path) {
$dirStruct = array();
if(is_dir($path)) {
$handle = opendir($path);
while(($file = readdir($handle)) !== false) {
if($file != '.') {
if(@opendir($path.$file)) {
$newpath = "";
if($file == '..') {//begin constructing the path for the upper level
$array = @split('/',$path);
$up = "";
for($i = 0; $i < count($array) - 2; $i++) {
$up = $up.$array[$i].'/';
}
$file = "Up one Level";
//if the upper level exceeds the home dir
if(strcmp($up,$basepath) < 0) {
$newpath = $basepath;//use the basepath
}
else {
$newpath = $up;
}
}
else {//construct the path for a normal dir
$newpath = $path.$file.'/';
$newpath = fixPath($newpath);
}
$dirStruct[] = array('path' => $newpath, 'name'=>$file);
}
}
}
}
//sortArray($dirStruct);
fixpath($dirStruct);
return $dirStruct;
}
答案 0 :(得分:0)
您需要通过引用传递它以保持更改:)
function fixArray(&$array) {
for($i = 0; $i < count($array); $i++) {
if($array[$i]['name'] == "Up one Level") {
$up = $array[$i];
unset($array[$i]);
array_unshift($array,$up);
break;
}
}
}
答案 1 :(得分:0)
您的交换正在交换,然后交换回来。 $array[0] = $array[$i];
应为$array[0] = $aux;
但是这会将原始的第一个元素交换到数组的中间。你可以通过将目标元素移动到数组的前面来实现。
试试这个:
function fixArray($array) {
for($i = 0; $i < count($array); $i++) {
if($array[$i]['name'] === "Up one Level") {
$aux = $array[$i];
array_unshift($array, $aux);
unset($array[$i]);
break;
}
}
return $array;
}
并打电话:
$dirStruct = fixpath($dirStruct);