
本文介绍如何使用 PHP 扫描目录(如 archives/),筛选出匹配特定命名规则的文件(如 *-pairings.txt),将其路径名存入数组,并序列化为标准 JSON 字符串写入磁盘(如 archives/contents.json)。
本文介绍如何使用 php 扫描目录(如 `archives/`),筛选出匹配特定命名规则的文件(如 `*-pairings.txt`),将其路径名存入数组,并序列化为标准 json 字符串写入磁盘(如 `archives/contents.json`)。
要实现“列出目录中所有 *-pairings.txt 文件 → 转为 JSON 数组 → 写入磁盘”的完整流程,关键在于两点:正确获取过滤后的文件列表 和 正确序列化并持久化数据。原始代码失败的核心原因有二:
- fwrite($myfile, $arrFiles) 尝试直接向文件写入数组,而 PHP 会将其强制转换为字符串 "Array",导致内容为空;
- 未对文件名进行后缀过滤(如只保留 *-pairings.txt),也未排除 .、.. 及目标输出文件(如 contents.json)本身,易引发逻辑错误或循环写入。
推荐使用以下健壮、可复用的函数实现:
function listContentsBySuffix(string $dir, string $suffix = '-pairings.txt'): void
{
$dir = realpath($dir);
if (!$dir || !is_dir($dir)) {
throw new InvalidArgumentException("Invalid directory: {$dir}");
}
$files = scandir($dir);
$matched = [];
foreach ($files as $file) {
// 排除系统目录项和自身输出文件
if (in_array($file, ['.', '..', 'contents.json'], true)) {
continue;
}
// 仅保留以指定后缀结尾的文件
if (str_ends_with($file, $suffix)) {
$matched[] = $file;
}
}
// 按字典序排序(可选,确保 JSON 输出稳定)
sort($matched);
$jsonContent = json_encode($matched, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
if ($jsonContent === false) {
throw new RuntimeException('JSON encoding failed: ' . json_last_error_msg());
}
$targetPath = $dir . '/contents.json';
if (file_put_contents($targetPath, $jsonContent) === false) {
throw new RuntimeException("Failed to write to {$targetPath}");
}
}
// 使用示例:
listContentsBySuffix('archives', '-pairings.txt');✅ 优势说明:
- 使用 scandir() 简洁高效,配合 str_ends_with()(PHP 8.0+)精准匹配后缀;低版本可用 substr($file, -strlen($suffix)) === $suffix 替代;
- 显式排除 .、.. 和 contents.json,避免污染结果或覆盖风险;
- 启用 JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE 提升可读性与兼容性;
- 内置异常处理与参数校验,便于集成到 Web 应用或 CLI 脚本中;
- sort() 确保每次生成的 JSON 数组顺序一致,利于版本控制与调试。
⚠️ 注意事项:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
立即学习“PHP免费学习笔记(深入)”;
- 确保 archives/ 目录存在且 PHP 进程具有读取权限;
- 若需递归扫描子目录,请改用 RecursiveDirectoryIterator;
- 生产环境建议添加日志记录(如 error_log())替代抛出异常;
- 避免在高并发场景下频繁调用该函数——可考虑缓存机制或定时任务生成。
执行后,archives/contents.json 将生成符合预期的标准化 JSON 数组,例如:
["2012-01-02-pairings.txt","2012-05-17-pairings.txt","2021-03-17-pairings.txt"]
至此,目录文件清单已可靠持久化,可被前端 JavaScript 或其他服务直接消费。


















