【问题标题】:Learning PHP. Have recursive directory loop issue学习 PHP。有递归目录循环问题
【发布时间】:2015-12-06 02:55:49
【问题描述】:

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

我有一个文件夹,还有其他文件夹,其中包含图像。

目前,我只是想获取文件夹列表作为链接。我有点在那里,但是我的输出总是颠倒的! Folder01Folder02Folder02Folder01 出现。我不能对我的输出进行排序。我一直在寻找,试图弄清楚这一点,但对我没有任何帮助。

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

?>

这个输出:Folder02Folder01。我需要它反过来。我已经尝试过 asort、array_reverse 等,但我一定不能正确使用它们。这是要了我的命。除非我真的想要一个升序列表...

【问题讨论】:

  • 试试scandir('./photos/'),看看这个列表是否更好。
  • 另外一个directoryiterator 对象可能是另一种选择。
  • 你也可以试试dir()
  • 如果您正在寻找递归,请使用recursivedirectoryiterator
  • 我使用了 recursiveDirectoryIterator,这让我得到了一些更好的信息,但并没有解决我的列表顺序颠倒的问题。有什么建议可以补救吗?一切都是从高到低打印的,而我需要反过来。

标签: php


【解决方案1】:

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

// 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);

【讨论】:

  • 感谢您这样做,但我无法得到任何工作。我无法得到显示尝试这两种方法的结果。如果您想看看,我正在发布一些让我更接近目标的内容。
【解决方案2】:

我尝试了您的代码并进行了简单的更改,然后我就能做您想做的事情。

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

function listAlbums() {
$files = array();
if ($handle = opendir('./photos/')) {
    while (false !== ($entry = readdir($handle))) {
        if ($entry != "." && $entry != "..") {
            //echo $entry . "<br/>";
            $files[] = $entry;
        }
    }
    closedir($handle);
}
// Sort your folder in ascending order
sort($files);

// Sort your folder in descending order [ code commented ]
//rsort($files);

// Check your photos folder has folder or not 
if( !empty( $files ) ) {
    // Show Your Folders 
    foreach ($files as $key => $folderName ) {
        echo $folderName . "<br/>";
    }
} else {
    echo 'You have no folder yet in photos directory';
}

}

我的改变:

  1. 首先将照片目录中的所有文件夹存储在数组变量中
  2. 再按您想要的顺序对该数组进行排序。
  3. 最后显示您的文件夹(您的工作将得到解决)

您可以通过sort-and-display-directory-list-alphabetically-using-opendir-in-php了解更多信息

谢谢

【讨论】:

    【解决方案3】:

    好的,这是我整晚得到的最好结果。这完成了我需要的 99% 的工作。但我仍然无法弄清楚这个该死的问题。此代码将遍历目录列表,并从每个文件夹中的图像创建灯箱画廊。但是,第一个图像总是数组中的最后一个,我不知道如何让它正常排序!检查第 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>"; 
            }
        }
    }       
    

    ?>

    【讨论】:

    • [ link ]这家伙似乎和我有同样的问题。使用 DirectoryIterator 后他的文件是随机出现的,而不是按字母顺序升序。但我无法让他的解决方案为我工作,而且我不确定它如何适合我自己的循环。他提到了一些关于为 usort 函数创建自己的比较器的事情,但我无法让它在我当前的代码中工作。有什么想法吗?
    【解决方案4】:

    哇!好的,我让一切正常。 DirectoryIterator 的随机打印顺序让我很生气。所以我回到了 glob 和 scandir。那些似乎“合乎逻辑地”打印出一个列表。总而言之,这部分 php 将抓取图像文件夹并将每个文件夹变成自己的灯箱画廊。每个画廊都显示为触发灯箱画廊的超链接。我很满意!

    这是我的最终代码:

    <?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>";
            }
        }
    }       
    

    特别感谢 Rasclatt 与我一起度过了这一切,并提供了很多帮助和帮助。我真的很感激!

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 2020-01-10
      相关资源
      最近更新 更多