如何使用PHP按最新时间戳对目录文件HTML表格行排序
嘿,这个需求很常见嘛!要让游戏服务器的录制文件按最新的排在最前面,核心就是对文件列表做降序排序,给你两种靠谱的方案,你可以根据自己的实际情况选:
方案一:按文件修改时间排序(简单直接)
如果你的录制文件上传后的修改时间和文件名里的时间戳一致,这个方法最省心,不需要解析文件名,直接用系统的文件修改时间来排序:
// 替换成你的录制文件目录 $recordDir = './server_recordings/'; // 获取目录下所有录制文件(这里假设是.mp4格式,根据你的实际后缀调整) $files = glob($recordDir . '*.mp4'); // 用usort自定义排序:最新修改的文件排在前面 usort($files, function($fileA, $fileB) { // filemtime获取文件最后修改时间的时间戳,用B减A实现降序 return filemtime($fileB) - filemtime($fileA); }); // 输出表格(这里保留你原来的时间戳格式化逻辑) echo '<table border="1">'; echo '<tr><th>文件名</th><th>录制时间</th></tr>'; foreach ($files as $file) { $fileName = basename($file); // 这里是你原来的时间戳格式化代码,比如从文件名提取并转成"YYYY-MM-DD HH:MM" // 举个例子:如果文件名是"rec_201804292045.mp4" preg_match('/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/', $fileName, $timeParts); $formattedTime = $timeParts[1] . '-' . $timeParts[2] . '-' . $timeParts[3] . ' ' . $timeParts[4] . ':' . $timeParts[5]; echo '<tr>'; echo '<td>' . htmlspecialchars($fileName) . '</td>'; echo '<td>' . $formattedTime . '</td>'; echo '</tr>'; } echo '</table>';
方案二:按文件名中的时间戳排序(精准匹配)
如果文件的修改时间可能和录制时间不一致(比如重新上传过文件),那直接解析文件名里的时间戳来排序更准确:
$recordDir = './server_recordings/'; $files = glob($recordDir . '*.mp4'); // 自定义排序:按文件名里的时间戳降序排列 usort($files, function($fileA, $fileB) { $nameA = basename($fileA); $nameB = basename($fileB); // 提取文件名里的时间戳字符串,这里的正则要匹配你的实际文件名格式 // 比如文件名是"2018-04-29_20-45_server_rec.mp4",正则就改成/(\d{4}-\d{2}-\d{2}_\d{2}-\d{2})/ preg_match('/(\d{4}\d{2}\d{2}\d{2}\d{2})/', $nameA, $matchA); preg_match('/(\d{4}\d{2}\d{2}\d{2}\d{2})/', $nameB, $matchB); // 处理没有时间戳的异常文件,默认排到最后 if (empty($matchA) || empty($matchB)) { return 1; } // 把时间戳字符串转成整数,方便比较大小 $timeStampA = (int)$matchA[1]; $timeStampB = (int)$matchB[1]; // 降序排序,大的时间戳排前面 return $timeStampB - $timeStampA; }); // 后面的表格输出和方案一完全一样,直接复用你原来的代码就行
几个小提醒:
- 一定要根据你的实际文件名格式调整正则表达式,不然提取不到时间戳就白忙活了!
- 用
htmlspecialchars()转义文件名,防止文件名里的特殊字符破坏HTML结构,还能避免XSS风险。 - 如果目录里有子文件夹,记得加个判断
if (is_file($file))过滤掉,只处理文件。
内容的提问来源于stack exchange,提问作者rickdev
相关产品推荐
相关产品推荐

