排序文件夹名称数组以显示文件夹的内容

时间:2010-06-30 22:30:10

标签: php

我编写了一个获取文件夹所有子文件夹的函数。它还可以选择进入上一级并显示文件夹....就像文件管理器一样,但它只适用于文件夹,并且限制不要高于基本文件夹,以防止用户浏览整个文件夹硬盘。

我将结果作为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;
    }

2 个答案:

答案 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);