PHP :遍历 FTP 文件夹并创建一个 HTML table

PHP : Iterating through FTP folder and create an HTML table

我是 PHP 的新手,为了简单起见,我会说我正在尝试创建一个粗糙的网站,我想在其中创建一个 HTML table检查 FTP 文件夹的内容,如果找到目标,则在 table 中添加一个点,如果没有找到,则添加一个空单元格 (w/ a  )。

这是我的代码和文件夹结构:

<table border=1 >
<?php
foreach ($demolist as &$value) {

    if($value != "." && $value != ".." && $value!=".DS_Store" ){
        ?> <tr> <?php
        echo '<td> <a href="./layouts/'.$value.'/index.html'.'">'.$value.'</a </td>';

        $png = $prezLayouts.$value;

        echo $png.'<br>';

        $sizeList = ftp_nlist($connection, $png);
        natsort($sizeList);

        foreach($sizeList as $target) {

            if($target != "." && 
               $target != ".." && 
               $target !=".DS_Store" && 
               $target != "index.html") {

                echo $target."<br>";

                if ($target == '640.png') { ?> <td> <?php echo "&#8226";  ?> </td> <?php  }

                elseif ($target == '768.png') { ?> <td> <?php echo "&#8226";  ?> </td> <?php }

                elseif ($target == '1000.png') { ?> <td> <?php echo "&#8226";  ?> </td> <?php }

                elseif ($target == '1200.png') { ?> <td> <?php echo "&#8226";  ?> </td> <?php }

                else { ?> <td> <?php echo "&nbsp"; ?> </td> <?php } ?>

                <?php 
            }

        }   
    ?> </tr> <?php
    }
}       
?> </table>

循环回显的输出

/domains/~~/html/demo/layouts/about
1000.png
1200.png
/domains/~~/html/demo/layouts/buy
640.png
768.png
/domains/~~/html/demo/layouts/contact
640.png
768.png
1000.png
1200.png
/domains/~~/html/demo/layouts/homepage
640.png
1000.png
1200.png
/domains/~~/html/demo/layouts/social
640.png

现在,我的问题是获取每个文件夹中的文件列表无法让我检查文件夹中不存在 的文件。 (doi) 我能想到的唯一粗略的解决方案是使用 [640.png、768.png、1000.png、1200.png] 创建一个静态数组并使用它来检查文件在文件夹中,但我肯定有更优雅的解决方案。

可以试试下面的代码。如果可能,最好不要闯入和闯出 PHP 和 HTML。

<?php
// Start HTML Table wrapper
$table = "<table border=1>\r\n";

foreach ($demolist as &$value) {
    if($value != "." && $value != ".." && $value != ".DS_Store"){
        // Start Table Row wrapper
        $table .= "<tr>\r\n";
        // First Cell
        $table .= "<td><a href='./layouts/$value/index.html'>$value</a></td>";
        $png = $prezLayouts.$value;
        // Second Cell
        table .= "<td>$png</td>";
        // This section does not make sense... your HTML table could result in uneven columns.
        $sizeList = ftp_nlist($connection, $png);
        natsort($sizeList);

        foreach($sizeList as $target) {
            // We have already ruled out 3 conditions above, so we only need to rule out index.html
            if($target != "index.html") {
                $table .= "<td>" . (strripos($target, ".png")?"&#8226;":"&nbsp;") . "</td>";
            }
        }   
    }
    // Close Table Row wrappper
    $table .= "</tr>\r\n";
}
// Close Table wrapper
$table .= "</table>\r\n";
echo $table;
?>

我可以建议一个改进,如果您知道 PNG 文件的总数或所有可能的标题,可以使用它。 for() 循环或创建一个可能的文件名数组。

$imageNames = array("640.png", "768.png", "1000.png", "1200.png");
$imageExists = array();
$sizeList = ftp_nlist($connection, $png);
natsort($sizeList);

foreach($imageNames as $n) {
    foreach($sizeList as $target){
        $imageExists[$n] = true;
    }
}
foreach($imageExists as $e){
    $table .= "<td>" . ($e)?"$#8226;":"&nbsp;" . "</td>";
}

由于我们要查找 4 个特定文件名,因此我们迭代所有可能的值,查找每个文件名。这将确保您对每个可能的文件名都有一个值。并使每一行的列计数相同。

也许更好:

foreach($imageNames as $n) {
    $table .= "<td>" . (array_search($n, $sizeList)?"&#8226;":"&nbsp;") . "</td>"
}