[英]PHP recursive directory menu (different approaches)
我正在嘗試創建一個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(參見'實質上' '上面的間距)?
NB我是編程和PHP的新手,所以請記住,我明顯的錯誤可能非常簡單。 如果他們是,請提前抱歉。
編輯 :什么也是一個巨大的獎金將擺脫文件名末尾的“.pdf”,但這可能是一個完全不同的問題/問題。
PHP5有一個名為RecursiveDirectoryIterator的類
這段代碼:
..
$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>';
首先,我在那里看到這條線
$str_result .= "</ul>";
但我沒有看到一個開放的ul標簽。 這可能是瘋狂結果的來源。
1)我會使用scandir而不是readdir,因為它可以讓你設置排序順序。
2,3)擺脫$str_result .= "</ul>";
並在你的while循環中嘗試這樣的東西來刪除dir鏈接並獲得正確的順序:(注意:我沒有運行這個)
if( ! in_array($file, array('.', '..')) ) {
if( is_dir($parent_dir . "/" . $file) ){
$str_result .= "<li>{$file}</li>";
$str_result .= "<ul>";
$str_result .= "<li>" . read_dir_content($parent_dir . "/" . $file, $depth++) . "</li>";
$str_result .= "</ul>";
} else {
$str_result .= "<li><a href='prs/{$file}'>{$file}</a></li>";
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.