PHP从目录生成HTML文件数组问题(已更新)
问题描述
我已经简化了文件夹结构,想靠PHP和基础JavaScript做一个带分页的作品集博客,但PHP知识不够卡壳了。首页需要生成包含文章标题、内容、发布日期、摘要和永久链接的数组,所有文件都以YYYYMMDD为基础文件名,按类型用.html或.php扩展名。文件夹结构如下:
articles | | title | YYYYMMDD.html | | summary | YYYYMMDD.html | | content | YYYYMMDD.html | | date | YYYYMMDD.html blog | | YYYYMMDD.php
现在的问题是拿不到各个目录里的文件或文件名,试了scandir()和glob()都没返回结果。我写的代码如下:
<?php $titleDirectory = '/articles/title/'; $dateDirectory = '/articles/date/'; $summaryDirectory = '/articles/summary/'; $contentDirectory = '/articles/content/'; $permalinkDirectory = '/blog/'; $title = scandir($titleDirectory, 1); $date = scandir($dateDirectory, 1); $summary = scandir($summaryDirectory, 1); $content = scandir($contentDirectory, 1); $permalink = scandir($permalinkDirectory, 1); $postCount = count($permalink); for ($post = 0; $post < $postCount; $post++) { echo "<article class='post'>"; echo "<h3 class='postTitle'>" . file_get_contents($title[$post]) . "</h3>"; echo "<div class='postBody'>" . file_get_contents($summary[$post]) . "</div>"; echo "<a class='postLink' href='" . $permalink . "'>" . file_get_contents($date[$post]) . "</a>"; echo "</article>"; } ?>
运行之后输出的内容是:
"; echo " " . file_get_contents($title[$post]) . " "; echo " " . file_get_contents($summary[$post]) . " "; echo "" . file_get_contents($date[$post]) . ""; echo ""; } ?>
解决方案
1. 修复路径问题(核心原因)
你用的/articles/title/是服务器根目录的绝对路径,大概率不是你项目所在的位置。改成相对路径或者基于当前文件的绝对路径:
- 相对路径:如果PHP文件在项目根目录,直接写
articles/title/(去掉开头斜杠) - 更可靠的写法:用
__DIR__获取当前PHP文件所在目录,拼接成完整路径,比如__DIR__ . '/articles/title/'
2. 检查目录权限
确保Web服务器(Apache/Nginx等)有读取这些目录的权限。可以加代码检查:
$titleDirectory = __DIR__ . '/articles/title/'; if (!is_readable($titleDirectory)) { die("无法读取标题目录,请检查权限"); }
3. 修正代码逻辑错误
scandir()会返回.和..(当前/上级目录),必须过滤掉,否则循环会读取无效路径file_get_contents()需要完整文件路径,不能直接用$title[$post],要拼接目录前缀- 输出链接时,你用了数组
$permalink而不是数组元素$permalink[$post]
修改后的完整代码:
<?php // 基于当前文件目录拼接路径,避免出错 $baseDir = __DIR__; $titleDir = $baseDir . '/articles/title/'; $dateDir = $baseDir . '/articles/date/'; $summaryDir = $baseDir . '/articles/summary/'; $blogDir = $baseDir . '/blog/'; // 批量检查目录有效性 $checkDirs = [$titleDir, $dateDir, $summaryDir, $blogDir]; foreach ($checkDirs as $dir) { if (!is_dir($dir) || !is_readable($dir)) { die("目录不可读或不存在:{$dir}"); } } // 获取目录文件并过滤无效条目 function getValidFiles($dir) { $files = scandir($dir, 1); return array_filter($files, function($file) { return $file !== '.' && $file !== '..'; }); } $titleFiles = getValidFiles($titleDir); $dateFiles = getValidFiles($dateDir); $summaryFiles = getValidFiles($summaryDir); $blogFiles = getValidFiles($blogDir); // 确保各目录文件数量匹配 $postNum = count($blogFiles); if (count($titleFiles) !== $postNum || count($dateFiles) !== $postNum || count($summaryFiles) !== $postNum) { die("各目录文件数量不匹配,请检查"); } // 循环输出文章 foreach ($blogFiles as $index => $blogFile) { // 用文件名前缀(YYYYMMDD)匹配对应文件 $filePrefix = pathinfo($blogFile, PATHINFO_FILENAME); $titlePath = $titleDir . "{$filePrefix}.html"; $datePath = $dateDir . "{$filePrefix}.html"; $summaryPath = $summaryDir . "{$filePrefix}.html"; // 跳过缺失的文件 if (!file_exists($titlePath) || !file_exists($datePath) || !file_exists($summaryPath)) { continue; } // 输出文章结构 echo "<article class='post'>"; echo "<h3 class='postTitle'>" . file_get_contents($titlePath) . "</h3>"; echo "<div class='postBody'>" . file_get_contents($summaryPath) . "</div>"; echo "<a class='postLink' href='{$blogDir}{$blogFile}'>" . file_get_contents($datePath) . "</a>"; echo "</article>"; } ?>
4. 解决输出乱码问题
你看到的输出是PHP代码片段,说明服务器没正确解析PHP文件:
- 确保文件扩展名是
.php,不是.html - 检查服务器是否启用了PHP模块,或者是否配置了PHP解析规则
内容的提问来源于stack exchange,提问作者Pandappuccino
相关产品推荐
相关产品推荐

