0

メンバーの一意のフォルダ内のすべてのサブディレクトリに保存されているファイルのセットを一覧表示しようとしています。

ここでは、ファイルがどのように保存されているかを確認できます。

    date_default_timezone_set('EST');
    $id = $_SESSION['id'];
    $udir = "members/".$id."/";
    $date = date("Y.m.d");
    $curdir = $udir.$date."/";
    $datetime = date("Y.m.d.G.i.s");
    $fname = $_FILES["file"]["name"];
    $extn = pathinfo($fname, PATHINFO_EXTENSION);
    if(!is_dir($curdir)){
        mkdir($udir.$date, 0700);
    }
    $ufile = $curdir.$datetime.".".$extn;
    $allexts = array("jpg", "jpeg", "gif", "png");
    $ext = end(explode(".", $_FILES["file"]["name"]));
    if((($_FILES["file"]["type"] == "image/gif")
        || ($_FILES["file"]["type"] == "image/jpeg")
        || ($_FILES["file"]["type"] == "image/pjpeg")
        || ($_FILES["file"]["type"] == "image/png"))
        && ($_FILES["file"]["size"] < 2000000)
        && in_array($ext, $allexts)){
        if (move_uploaded_file($_FILES['file']['tmp_name'], $ufile)) {
            echo "File upload was successful.";
        } else {
            echo "An error has occured. Please try again.";
        }
    }
    else{
        echo "Invalid file. Please try again.";
    }

今、私はここに示されているようにそれらのファイルを利用しようとしています:

    $id = $_SESSION['id'];
    $udir = "members/".$id."/";
    if ($dir = opendir("$udir")) {
        while (false !== ($file = readdir($dir))) {
            if ($file != "." && $file != "..") {
                $list .= '<li><a href="'.$udir.$file.'">'.$file.'</a></li>';
            }
        }
        closedir($dir);
    }

ご想像のとおり、これはメンバーの一意のIDフォルダー内のサブディレクトリのリストのみを返します。したがって、ディレクトリを掘り下げているように見える再帰関数を試してみましたが、2つをマージする方法がわかりません。以下のコードはすべてのファイルのフルパスを返しますが、それは私が得た限りです。

    $path = realpath("$udir");
    $recur = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
    foreach($recur as $files => $recur){
    echo "$files";}

これらの2つの機能をマージする際のガイダンス、または完全な代替手段をいただければ幸いです。

編集:私は以下の提案を利用しようとしましたが、$listを呼び出しても結果が得られません。これが変更されたコードです。

    $id = $_SESSION['id'];
    $udir = "members/".$id."/";
    if ($dir = opendir($udir)) {
        while (false !== ($file = readdir($dir))) {
            if ($file != "." && $file != "..") {
                if (is_dir($file) === true){
                    $dir = opendir("$file");
                    $file = readdir($dir);
                    $list .= '<li><a href="'.$udir.$file.'">'.$file.'</a></li>';
                    closedir($file);
                }
                else if (is_file($file) === true){
                $list .= '<li><a href="'.$udir.$file.'">'.$file.'</a></li>';
                }
            }
        }
        closedir($dir);
    }
4

2 に答える 2

0

多分このように

function getDirectory($path = '.', $level = 0)
{
    $ignore = array( 'cgi-bin', '.', '..' ); 
    $dh = @opendir( $path );      
    while( false !== ( $file = readdir( $dh ) ) )
    {      
        if( !in_array( $file, $ignore ) )
        {             
            $spaces = str_repeat( '&nbsp;', ( $level * 4 ) );
            if( is_dir( "$path/$file" ) )
            {             
                echo "<strong>$spaces $file</strong><br />"; 
                getDirectory( "$path/$file", ($level+1) );

            }
            else
            {             
                echo "$spaces $file<br />";            
            }
        } 
    } 
    closedir( $dh ); 
} 

getDirectory("/var");
于 2012-08-13T17:36:21.727 に答える
0

私はあなたの問題を本当に理解していません。2番目のブロックを関数に移動して再帰的に呼び出してみませんか?

function listDir($udir) {
    $list = '';
    if ($dir = opendir($udir)) {
        while (false !== ($file = readdir($dir))) {
            if ($file != '.' && $file != '..') {
                if (is_dir($udir.'\\'.$file) === true) {
                    $list .= listDir($udir.'\\'.$file);
                } else if (is_file($udir.'\\'.$file) === true) {
                    $list .= '<li><a href="'.$udir.'\\'.$file.'">'.$file.'</a></li>';
                }
            }
        }
        closedir($dir);
    }
    return $list;
}

echo '<ul>'.listDir('D:\<test>\<test>').'</ul>';

編集:フィードバックを含むようにコードを更新

于 2012-08-13T17:33:56.530 に答える