如何从目录中的文件在PHP中创建菜单?


How can I create a menu in PHP from files in a directory

我是PHP的新手,想从目录中包含的文件创建菜单。当我添加文件时,我想让菜单自动添加一个项目。

目录中的文件是。htm文件,命名约定是年,然后用下划线分隔月,即2013_6.htm (June 2013)

我希望能够读取文件,然后从这些文件创建一个菜单。

我已经设法创建了一个有序的文件数组,像这样(工作良好):

$dir = "$cal_path";
$dh  = opendir($dir);
while (false !== ($filename = readdir($dh))) {
    if ($filename != "." && $filename != ".."){
    $files[] = $filename;
    }
}
sort($files);

我现在如何将这个文件数组放入一个菜单项列表中,然后我可以使用CSS样式,就像这样,其中xxxx是文件名中的年份,yy是文件名中的月份。

$cal_menu = 
<ul>
 <li><a href="$base_url/calendar_view?year=xxxx&month=yy">June 2013</a></li>
 <li>etc</li>
 <li>etc</li>
</ul>

我创建了一个包含月份和对应月份名称的数组

$CalendarMonth = array("1"=>"January","2"=>"February","3"=>"March","4"=>"April","5"=>"May","6"=>"June","7"=>"July","8"=>"August","9"=>"September","10"=>"October","11"=>"November","12"=>"December");
我希望我已经正确地解释了我的问题。

你可以试试下面的代码:

EDIT:当你想把输出保存在一个变量中

rsort($files);
$cal_menu = '<ul>';
foreach($files as $file){ 
    preg_match('/('d{4})_('d.*).htm/i', $file, $date);
    $mont_name = $CalendarMonth[$date[2]];
    $cal_menu .= '<li><a href="$base_url/calendar_view?year='.$date[1].'&month='.$date[2].'">'.$mont_name.' '.$date[1].'</a></li>';
}
$cal_menu .= '</ul>';

这段代码将每个li项的输出设置为所需的格式:?year=xxxx&month=yy

试试这个

foreach ($files as $file) {
// pathinfo will return an array containing
// dirname,basename,extension,filename then use extract
// to convert the array into variables
extract(pathinfo($file)); 
echo "<li><a href="$file">$filename</a></li>"
}
</ul>

阅读更多关于pathinfo http://php.net/manual/en/function.pathinfo.php阅读更多关于提取http://us2.php.net/manual/en/function.extract.php

使用循环从每个带有pathinfo的文件名中提取数据。您可以在现有的循环中执行此操作,但这里它是作为foreach:

echo '<ul>';
foreach($files as $filename) {
     $f_info = pathinfo($dir . '/' . $filename);
     $extension_length = strlen('.' . $f_info['extension']);
     $f_parts = substr($f_info['filename'], 0, -$extension_length);
     $year = $f_parts[0];
     $month = $f_parts[1];
     echo '<li><a href="' . $base_url . '/calendar_view?year=' . $year .
          '&month=' . $month . 'yy">' . $CalendarMonth[$month] . ' ' .
          $year . '</a></li>';
}
echo '</ul>';

在使用$CalendarMonth[$month]之前,您可能需要使用array_key_exists来验证$month是否确实存在于$CalendarMonth中。

试试这个例子。它应该给你一个想法。

foreach ($files as $file) {
    preg_match('/^('d{4})_('d{1,2}}/', $file, $match); // Parse filename into YYYY_MM
    $year = $match[1];
    $month = $match[2];
    $monthname = $CalendarMonth[$month];
    // Interpolate these into HTML output
    echo "<ul>
          <li><a href='$base_url/calendar_view?year=$year&month=$month'>$monthname $year</a></li>
          <li>etc</li>
          </ul>'n";
}