我正在尝试在彼此之间进行多个foreach循环并停在12点,这是我到目前为止无法正常工作的内容。它确切地显示了我想要的方式。但是,每个文件都应该循环遍历,但是对于每个目录中的第一个图像,它会一遍又一遍地显示图像1。
<?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>Test</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">File Name</th>
<th scope="col">PI 1</th>
<th scope="col">PI 2</th>
<th scope="col">PI 3</th>
</tr>
</thead>
<tbody>
<tr></tr>
<tr>
<?php
array_multisort(array_map('filectime', ($files = glob("*.*", GLOB_BRACE))), SORT_DESC, $files);
$dirs = array($dirname, $dirnameTwo, $dirnameThree);
$comma_separated = implode(",", $dirs);
$i = 1;
foreach ($cam1 as $cams1) {
foreach ($cam2 as $cams2) {
foreach ($cam3 as $cams3) {
foreach ($files as $filename) {
if (file_exists($filename)) {
echo "</tr>";
echo "<td><font face='Arial' size='6'>$i</font></td>";
echo "<td><font face='Arial' size='6' color='red'>" . date("F d Y H:i", filemtime($filename));
echo "</font></td>";
}
print("
<td><img src='$dirs[0]/$cams1' height='180' width='220'></td>
<td><img src='$dirs[1]/$cams2' height='180' width='220'></td>
<td><img src='$dirs[2]/$cams3' height='180' width='220'></td>
");
$i++;
if ($i == 13) break;
}
}
}
}
?>
</tr>
</tbody>
</table>
</div>
</div>
</div>
循环持续经过12点,仅一遍又一遍地显示每个目录中的第一个文件,而没有获取每个目录中的每个文件。
答案 0 :(得分:2)
我不确定您要做什么-您没有提供任何示例输入和输出,并且您的代码以非常不清楚的样式编写-但是有些事情在我看来错了
首先,您的最内层循环与其他三个循环都不相关:
foreach ($files as $filename)
您一次定义了$files
,埋在这条丑陋的行的中间:
array_multisort(array_map('filectime', ($files = glob("*.*", GLOB_BRACE))), SORT_DESC, $files);
因此,最里面的循环将一遍又一遍地查看相同的文件列表。
这也意味着该行是多余的:
if (file_exists($filename))
除非自PHP运行glob
命令以来在几秒钟内删除了文件,否则这将始终是正确的,因为$files
被存在的文件填充。
第二,嵌套循环最终将不仅遍历每个目录中的每个项目,而且遍历每种可能的组合。考虑以下微型示例:
$cam1 = ['a', 'b'];
$cam2 = ['c', 'd'];
$cam3 = ['e', 'f'];
$files = ['g', 'h'];
foreach ($cam1 as $cams1) {
foreach ($cam2 as $cams2) {
foreach ($cam3 as $cams3) {
foreach ($files as $filename) {
echo "$cams1, $cams2, $cams3, $filename \n";
}
}
}
}
输出:
a, c, e, g
a, c, e, h
a, c, f, g
a, c, f, h
a, d, e, g
a, d, e, h
a, d, f, g
a, d, f, h
b, c, e, g
b, c, e, h
b, c, f, g
b, c, f, h
b, d, e, g
b, d, e, h
b, d, f, g
b, d, f, h
很难确定这是否是您想要的。
第三,a break
statement仅会中断 one 循环,除非您为其指定参数。因此,此行将跳出foreach($files as $filename)
循环:
if ($i == 13) break;
要打破所有 循环,您需要命名要打破的循环数:
if ($i == 13) break 4;