彼此之间有多个foreach循环

时间:2019-02-27 18:25:55

标签: php html

我正在尝试在彼此之间进行多个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点,仅一遍又一遍地显示每个目录中的第一个文件,而没有获取每个目录中的每个文件。

1 个答案:

答案 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;