1

リスト内の各ディレクトリ内のディレクトリとファイルを表示する PHP メニューを作成しようとしています。これらのディレクトリ内の各ファイルへのリンクがあります (ただし、ディレクトリ自体へのリンクはありません)。ディレクトリは「2013」、「2014」などの数値で、これらのディレクトリ内のファイルは PDF です。

本質的に:

--- 2013 (リンクなし)

--------------- 01.pdf(リンク)

--------------- 02.pdf(リンク)

--------------- 03.pdf(リンク)

--- 2014 (リンクなし)

--------------- 04.pdf(リンク)

--------------- 05.pdf(リンク)

--------------- 06.pdf(リンク)

現在、私のコードは次のようになっています。

<?php
function read_dir_content($parent_dir, $depth = 0){
    if ($handle = opendir($parent_dir)) 
    {
        while (false !== ($file = readdir($handle)))
        {
            if(in_array($file, array('.', '..'))) continue;
            if( is_dir($parent_dir . "/" . $file) ){
                $str_result .= "<li>" . read_dir_content($parent_dir . "/" . $file, $depth++) . "</li>";
            }
            $str_result .= "<li><a href='prs/{$file}'>{$file}</a></li>";
        }
        closedir($handle);
    }
    $str_result .= "</ul>";
    return $str_result;
}
echo "<ul>".read_dir_content("prs/")."</ul>";
?>

ただし、これは処理時に完全な混乱を引き起こします。(残念ながら、私は新しいユーザーなので画像を投稿できませんが、タブーではない場合は、それへの卑劣なリンクを提供します:http://i.stack.imgur.com/gmIFz.png

私の質問/ヘルプのリクエスト:

1.英数字の順序が逆になっているのはなぜですか。つまり、2013 年がリストの一番下にあり、2014 年が一番上にあるのはなぜですか?

2. PDF へのリンクを保持したまま、ディレクトリへのリンクを削除するにはどうすればよいですか?

3.各ディレクトリのリストの最後に空のリスト項目がある理由と、それらが論理的/一貫して間隔をあけられていない理由、つまり、01、02、03 の PDF が 2013 に従属していない理由 (「本質的には' 上の間隔)?

注: 私はプログラミングと PHP を初めて使用するので、明らかな間違いが非常に単純である可能性があることを覚えておいてください。そうである場合は、事前に申し訳ありません。

編集:ファイル名の末尾にある「.pdf」を取り除くことも大きなボーナスになりますが、それはおそらくまったく別の質問/問題です。

4

2 に答える 2

3

PHP5 にはRecursiveDirectoryIteratorというクラスがあります

このコード:

  1. 必要に応じてリストを並べ替えます (最初に 2013、次に 2014)
  2. ディレクトリへのリンクを表示しない
  3. フォーマットの悩みを解決
  4. ボーナス: pdf 拡張子を削除します

..

$myLinks = array();
$dirIterator = new RecursiveDirectoryIterator($parent_dir);

//iterates main prs directory
foreach ($dirIterator as $file) {

    // If its a directory, it will iterate it's children (except if it's . or ..)
    if ($file->isDir() && $file->getFilename() != '.' && $file->getFilename() != '..') {
        $dir = new RecursiveDirectoryIterator($file->getRealPath());
        $myLinks[$file->getFilename()] = array();
        foreach ($dir as $subFile) {
            //If it finds a file whose extension is pdf
            if ($subFile->isFile() && $subFile->getExtension() == 'pdf') {
                // Gets its filename and removes extension
                $fname = str_replace('.pdf', '', $subFile->getFilename());
                // adds the file information to an array
                $myLinks[$file->getFilename()][$fname] = "prs/{$file->getFilename()}/{$subFile->getFilename()}";
            }
        }
    }
}

//Sort our array alphabetically (and numerically) and recursively
ksort_recursive($myLinks);

function ksort_recursive(&$array)
{
    if (!is_array($array)) return;
    ksort($array);
    foreach ($array as $k=>$v) {
        ksort_recursive($array[$k]);
    }
}



// now we print our links as a unordered list
print '<ul>';
foreach ($myLinks as $year => $val) {
    print "<li>$year";
    foreach ($val as $name => $link) {
        print "<li><a href='$link'>$name</a></li>";
    }
    print '</li>';
}
print '</ul>';
于 2013-11-09T04:43:01.590 に答える