学习PHP。存在递归目录循环问题

学习PHP。存在递归目录循环问题,php,Php,因此,我熟悉Javascript、HTML和Python。我从来没有学过PHP,现在,我正把头撞在桌子上,试图弄清楚(对我来说)什么是如此简单的事情 我有一个包含图像的文件夹和其他文件夹 目前,我只是想得到一个文件夹列表作为链接。我得到了一些,但我的输出总是相反的Folder01,Folder02以Folder02,Folder01的形式出现。我无法对输出进行快速排序。我一直在寻找,试图找出这一点,但没有任何工作为我 <?php function listAlbums(){ if

因此,我熟悉Javascript、HTML和Python。我从来没有学过PHP,现在,我正把头撞在桌子上,试图弄清楚(对我来说)什么是如此简单的事情

我有一个包含图像的文件夹和其他文件夹

目前,我只是想得到一个文件夹列表作为链接。我得到了一些,但我的输出总是相反的
Folder01
Folder02
Folder02
Folder01
的形式出现。我无法对输出进行快速排序。我一直在寻找,试图找出这一点,但没有任何工作为我

<?php
function listAlbums(){
    if ($handle = opendir('./photos/')) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                echo $entry . "<br/>";
            }
        }
        closedir($handle);
    }
}


这将输出:
Folder02
Folder01
。我需要另一种方式。我试过使用asort、array\u reverse等,但一定没有正确使用它们。这简直要了我的命。我从来没有在Python或Javascript中对此进行过细化,除非我真的想要一个升序列表…

尝试其中一个,一个是递归的,另一个不是:

// Recursive
function listAlbums($path = './photos/')
    {
        $objects    =   new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
        foreach($objects as $name => $object) {
            ob_start();
            echo rtrim($object,".");
            $data   =   ob_get_contents();
            ob_end_clean();

            $arr[] = $data;
        }

        return array_unique($arr);
    }
// Non-recursive
function getAlbums($path = './photos/')
    {
        $objects    =   dir($path);

        while (false !== ($entry = $objects->read())) {
            if($entry !== '.' && $entry !== '..')
                $arr[]  =   $path.$entry;
        }

        $objects->close();

        return $arr;
    }

// I would use __DIR__, but not necessary
$arr    =   listAlbums();
$arr2   =   getAlbums();

// Reverse arrays by key
krsort($arr);
krsort($arr2);

// Show arrays
print_r($arr);
print_r($arr2);

我尝试了你的代码并做了简单的更改,我可以做你想做的事情

这是我的代码(代码副本+修改):

函数列表相册(){
$files=array();
如果($handle=opendir('./photos/')){
while(false!==($entry=readdir($handle))){
如果($entry!=“&&&$entry!=”){
//回显$entry.“
”; $files[]=$entry; } } closedir($handle); } //按升序对文件夹进行排序 排序($文件); //按降序排列文件夹[代码注释] //rsort(文件); //检查您的照片文件夹是否有文件夹 如果(!空($files)){ //显示您的文件夹 foreach($key=>$folderName形式的文件){ echo$folderName。“
”; } }否则{ echo“照片目录中还没有文件夹”; }
}

我的更改:

  • 首先将所有文件夹存储在数组变量的photos目录中
  • 其次,根据需要对数组进行排序
  • 最后显示您的文件夹(您的工作将得到解决)
  • 你可以从中了解更多


    谢谢

    好的,这是我整晚得到的最好的结果。这是我需要的99%。但我还是搞不懂这类问题。这段代码将遍历目录列表,并使用每个文件夹中的图像创建lightbox库。但是,第一个图像总是数组中的最后一个图像,我不知道如何才能让它正常排序!检查第16行,看看我在说什么

    <?php
    function listAlbums(){
        $directory = "./photos/";
    
        //get all folders in specified directory
        $folders = glob($directory . "*");
    
        //get each folder item name
        foreach($folders as $folderItem){
            //check to see if the folderItem is a folder/directory
            if(is_dir($folderItem)){
                $count = 0;
                foreach (new DirectoryIterator($folderItem) as $fileInfo) {
                    if($fileInfo->isDot()) continue;
                    $files = $folderItem."/".$fileInfo->getFilename();
                    if ($count == 0){  //This is where my issues start.  This file ends up being the last one in the list.  I need it to be the first.
                        echo '<a href="'.$files.'" data-lightbox="'.basename($folderItem).' "data-title="'.basename($files).'">'.basename($folderItem).'</a>' . "<br/>";
                        echo "<div style='display: none'>" . "<br/>";
                        $count++;
                    }else{
                        echo '<a href="'.$files.'" data-lightbox="'.basename($folderItem).' "data-title="'.basename($files).'">'.basename($folderItem).'</a>' . "<br/>";
                    }
                }echo "</div>"; 
            }
        }
    }       
    

    哇!好的,我把一切都搞定了。DirectoryIterator的随机打印顺序让我很生气。所以我又回到了glob和scandir。这些似乎“合乎逻辑地”打印出一份清单。总之,这段php将抓取图像文件夹,并将每个文件夹转换为自己的lightbox库。每个图库显示为一个超链接,可触发灯箱图库。我很满意

    这是我最后的代码:

    <?php
    function listAlbums(){
    
        $directory = "./photos/";
    
        //get all folders in specified directory
        $folders = glob($directory . "*");
    
        //get each folder item name
        foreach($folders as $folderItem){
            //check to see if the folderItem is a folder/directory
            if(is_dir($folderItem)){
                $count = 0;
                $scanDir = scandir($folderItem);
                foreach($scanDir as $file){
                    if ($file === '.' || $file === '..') continue;
                    $filePath = $folderItem."/".$file;
                    if ($count == 0){
                        echo '<a href="'.$filePath.'" data-lightbox="'.basename($folderItem).' "data-title="'.basename($folderItem)." ".strpbrk(basename($filePath, ".jpg"), '-').'">'.basename($folderItem).'</a>' . "<br/>";
                        echo "<div style='display: none'>" . "<br/>";
                        $count++;
                    }else{
                        echo '<a href="'.$filePath.'" data-lightbox="'.basename($folderItem).' "data-title="'.basename($folderItem)." ".strpbrk(basename($filePath, ".jpg"), '-').'">'.basename($folderItem).'</a>' . "<br/>";
                    }
                }echo "</div>";
            }
        }
    }       
    

    试试
    scandir('./photos/')
    相反,看看这个列表是否更好。还有一个
    directoryinterator
    对象可能是另一个选项。你也可以试试
    dir()
    。如果你在寻找递归,使用
    recursivedirectoryinterator
    我使用了recursivedirectoryinterator,这会给我带来一些更好的信息,但这并不能解决我的问题,我的列表顺序颠倒了。有什么补救的建议吗?所有内容都是从最高到最低打印的,我需要从另一个角度来打印。谢谢你这么做,但我无法让任何内容正常工作。我无法得到一个结果来证明我尝试了这两种方法。如果你想看一看的话,我正在发布一些让我离目标更近的东西。[]这家伙似乎和我有同样的问题。在使用DirectoryIterator之后,他的文件是随机生成的,而不是按字母顺序递增的。但我不能让他的解决方案为我工作,我也不确定它如何适合我自己的循环。他提到了一些关于为usort函数创建自己的比较器的事情,但我无法让它在我当前的代码中工作。有什么想法吗?
    <?php
    function listAlbums(){
    
        $directory = "./photos/";
    
        //get all folders in specified directory
        $folders = glob($directory . "*");
    
        //get each folder item name
        foreach($folders as $folderItem){
            //check to see if the folderItem is a folder/directory
            if(is_dir($folderItem)){
                $count = 0;
                $scanDir = scandir($folderItem);
                foreach($scanDir as $file){
                    if ($file === '.' || $file === '..') continue;
                    $filePath = $folderItem."/".$file;
                    if ($count == 0){
                        echo '<a href="'.$filePath.'" data-lightbox="'.basename($folderItem).' "data-title="'.basename($folderItem)." ".strpbrk(basename($filePath, ".jpg"), '-').'">'.basename($folderItem).'</a>' . "<br/>";
                        echo "<div style='display: none'>" . "<br/>";
                        $count++;
                    }else{
                        echo '<a href="'.$filePath.'" data-lightbox="'.basename($folderItem).' "data-title="'.basename($folderItem)." ".strpbrk(basename($filePath, ".jpg"), '-').'">'.basename($folderItem).'</a>' . "<br/>";
                    }
                }echo "</div>";
            }
        }
    }