You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:27:42