php - 在 3 列中显示来自 3 个目录的文件以及每个文件的创建/修改日期
问题描述
我正在寻求一些帮助以使其正常工作。
在根目录中,我有一个 index.php 文件(如下所示),并且还有 3 个文件夹。图像被随机添加到这些文件夹中,我想做的是在表格的这 3 列中显示(排序)每个文件夹中的最新文件及其创建/修改日期,或者基本上是添加日期。
我添加了一个屏幕截图来显示我到目前为止所拥有的内容,通过拉取每个文件夹中的最新文件,这 3 列工作正常。但是,在每张图片下,它们似乎都有相同的修改日期,这是错误的。
谁能看到我哪里出错了?
<?php
date_default_timezone_set('Europe/London');
$dirname = "dir1";
$dirnameTwo = "dir2";
$dirnameThree = "dir3";
$cam1 = scandir($dirname, 1);
$cam2 = scandir($dirnameTwo, 1);
$cam3 = scandir($dirnameThree, 1);
?>
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<head>
<meta http-equiv='refresh' content='10'>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<meta http-equiv='cache-control' content='max-age=0' />
<meta http-equiv='cache-control' content='no-cache' />
<meta http-equiv='expires' content='0' />
<meta http-equiv='expires' content='Tue, 01 Jan 1980 1:00:00 GMT' />
<meta http-equiv='pragma' content='no-cache' />
</head>
<html>
<body>
<style type="text/css">
.pi-title {
padding: 1rem;
}
</style>
<div class="container">
<div class="row">
<div class="pi-title">
<h3>Testing</h3>
</div>
<div class="table-container col-md-12">
<table class="table" border='1' cellpadding='5' cellspacing='0' bordercolor='#ccc'>
<thead class="thead-dark">
<tr>
<th scope="col">ID</th>
<th scope="col">1</th>
<th scope="col">2</th>
<th scope="col">3</th>
</tr>
</thead>
<tbody>
<tr></tr>
<tr>
<?php
error_reporting(E_ALL & ~E_NOTICE);
array_multisort(array_map('filemtime', ($files = glob("*.*", GLOB_BRACE))), SORT_DESC, $files);
$dirs = array($dirname, $dirnameTwo, $dirnameThree);
foreach ($files as $filename) {
for ($i = 1; $i <= 12; $i++) {
if (file_exists($filename)) {
echo "</tr>";
echo "<td><font face='Arial' size='6'>$i</font></td>";
echo "<td><img src='$dirs[0]/$cam1[$i]' height='180' width='220'><br>" . date("F d Y H:i", filemtime($filename));
echo "</td>";
echo "<td><img src='$dirs[1]/$cam2[$i]' height='180' width='220'><br>" . date("F d Y H:i", filemtime($filename));
echo "</td>";
echo "<td><img src='$dirs[2]/$cam3[$i]' height='180' width='220'><br>" . date("F d Y H:i", filemtime($filename));
echo "</td>";
}
if ($i === 12) break;
}
if ($i === 12) break;
}
?>
</tr>
</tbody>
</table>
</div>
</div>
</div>
解决方案
在这里,我将为其中之一做:
//covers a single folder
$dirname = "dir1";
$cam1 = [];
foreach(array_diff(scandir($dirname), ['.','..']) as $file){
$pathname = $dirname.DIRECORY_SEPERATOR.$file;
if(is_dir($pathname)) continue; //skip folders
$cam1[filemtime($pathname).'-'.$file] = $pathname;
}
ksort($cam1, SORT_NATURAL);
$latest = end($cam1);
理想情况下,您会在函数或循环中使用上述内容。循环或函数更好,因为如果您必须添加另一个文件夹,您只需将其添加到数组或使用它调用函数。没有它(你有它)如果你想添加另一个,你必须复制它的所有代码。对于一个数组,它会是这样的:
//covers all 3 directories
$dirs = ["dir1","dir2","dir3"];
$results = [];
foreach($dirs as $dirname){
$res = [];
if(!is_dir($dirname)) continue; //or issue an error
foreach(array_diff(scandir($dirname), ['.','..']) as $file){
$pathname = $dirname.DIRECORY_SEPERATOR.$file;
if(is_dir($pathname)) continue; //skip folders
$res[filemtime($pathname).'-'.$file] = $pathname;
}
ksort($res, SORT_NATURAL);
$results[$dirname] = end($res);
}
//['dir1' => 'dir1/somefile.jpg', 'dir2' => ....]
来解释一下。
array_diff
删除类似.
或的路径,..
这与scandir
. 这些就像后备文件夹或上文件夹。
我们可以检查给定的“路径”是否是一个目录,以跳过那些继续作为额外的预防措施。
获取文件的时间作为 UNIX 时间戳,然后我们附加文件名,因为如果在完全相同的秒内创建了 2 个文件,我们希望保留它们。
然后我们可以对键进行排序,这应该(如果我没记错的话)将最高的一个放在最后(或更大的最近时间戳)。然后我们只用 . 从数组中获取最后一个end
。
排序参数(scandir
参数 2)仅适用于文件名。
更新
[如何] 我会回显时间戳
那么有两种简单的方法,您可以filemtime
再次使用:
echo filemtime($results[$dirname]);
或者您可以在遍历它们时添加它:
foreach(array_diff(scandir($dirname), ['.','..']) as $file){
$pathname = $dirname.DIRECORY_SEPERATOR.$file;
if(is_dir($pathname)) continue; //skip folders
$filemtime = filemtime($pathname);
//$res[filemtime($pathname).'-'.$file] = $pathname;
//change the structure of this to:
$res[$filemtime.'-'.$file] = [
'pathname'=>$pathname,
'mtime' => $filemtime
];
}
然后你会做
echo $results[$dirname]['mtime'];
对于最后一个,我将它作为一个完整的功能(首选):
//all the above stuff wrapped in a function
function getLatestFromFolders($dirs, array $exclude = ['.','..']){
//normalize to array
if(!is_array($dirs)) $dirs = [$dirs];
$results = [];
foreach($dirs as $dirname){
//if(!is_dir($dirname)) continue; //or issue an error
if(!is_dir($dirname)) throw new Exception($dirname.' Not found');
$res = [];
foreach(array_diff(scandir($dirname), $exclude) as $file){
$pathname = $dirname.DIRECORY_SEPERATOR.$file;
if(is_dir($pathname)) continue; //skip folders
$filemtime = filemtime($pathname);
$res[$filemtime.'-'.$file] = [
'pathname'=>$pathname,
'mtime' => $filemtime
];
}//end foreach $files
ksort($res, SORT_NATURAL);
$results[$dirname] = end($res);
}//end foreach $dirs
return $results;
} //end getMyFolders
//call it like this for one path
$results = getLatestFromFolders('dir1');
echo $results['dir1']['mtime'];
echo $results['dir1']['pathname'];
//call it like this for multiple paths
$results = getLatestFromFolders(['dir1','dir2']);
echo $results['dir1']['mtime'];
echo $results['dir2']['mtime'];
//call it like this to exclude file .htaccess or any other files
//the ['.','..'] dosnt matter because of if(is_dir($pathname)) continue; //skip folders
$results = getLatestFromFolders(['dir1','dir2'], ['.htaccess']);
echo $results['dir1']['mtime'];
echo $results['dir2']['mtime'];
未经测试,但它应该在理论上有效。我无法在 sanbox 中对其进行测试,因为scandir
它们中的大多数都处于关闭状态。
所以请原谅任何错别字等...
我只是想对文件名使用preg_grep
或function getLatestFromFolders($dirs, $regex = '/.+/'){ ... foreach(preg_grep($regex, scandir($dirname)) as $file)
使用正则表达式。然后你可以做getLatestFromFolders($dir, '/\.(jpg|png)$/')
etc 并匹配扩展,但我将把它留到另一天。
谢谢!
推荐阅读
- css - Internet Explorer:禁止访问者访问
- javascript - 如何修复'TypeError:未定义不是对象(评估'subitem.media_details.sizes.medium.source_url')'
- powershell - PowerShell 直到步入循环
- ada - 错误消息:对“...”的前缀调用中的对象必须是别名
- swift - HackerRank 说~stdout 上没有响应~Swift
- google-cloud-platform - “libcontainerd:无法从 containerd 接收事件:rpc 错误:代码 = 13 desc = 传输正在关闭”
- pymc3 - 如何在pymc3中模拟伯努利斯的混合物
- ansible - 当列为依赖项时,如何防止ansible角色多次运行?
- python-3.x - 使用python,如何从字节中保存有效的音频文件?
- swift - 如何检查电话号码是否已经注册了firebase swift