PHP递归foreach循环

时间:2012-05-08 15:50:51

标签: php tree foreach

我在目录中有一个文件列表,格式为YearMonthDay Time,如下所示

20080508-120801suggestions.sql
20090508-120737categories.sql
20100508-120737articlelikes.sql
20110508-120737article.sql
20120508-120737comments.sql
20120508-120737loginusers.sql
20120508-120737popsearch.sql
20120508-120737suggestions.sql
20120508-120801article.sql

我希望我的PHP显示多年的一个项目,然后当你展开它然后它会显示一个月的项目然后再显示当天的一个项目然后那天所有可用的备份。

我已经完成了第一项工作,它列出了所有独特的年份,并且长时间盯着代码知道下一步该去哪里。

我将变量year传递给URL,因此可以根据需要将其作为代码的一部分。

if ($handle = opendir($_SERVER['DOCUMENT_ROOT'] . 'sqlbackup/')) 
{
    while (false !== ($entry = readdir($handle))) 
    {
        $isYearfound = 'false';
        //$dirlist = array();
        if (($entry != ".") AND ($entry != ".."))
        {
            foreach ($dirarray as $dirarrayyear)
            {
                if (substr($entry, 0, 4) == $dirarrayyear)
                {
                    $isYearfound = 'true';
                }
            }
            if ($isYearfound == 'false')
            {
                $dirarray[] = substr($entry, 0, 4);
                Print "<a href='myknowledge.php?mnpage=managedb&date=" . substr($entry, 0, 4) . "'>" . substr($entry, 0, 4) . "</a><br/>";
            }
            //Print $entry . "<br/>";
        }
    }
    closedir($handle);
}

4 个答案:

答案 0 :(得分:0)

所以第一部分看起来很好。但是您可能希望在URL中传递年份和月份,以便代码然后比较文件名的前6个字符,然后对于生成的那些URL,它将传递完整的8个字符。

first pass date=2008
second pass date=200805
third pass date=20080501

答案 1 :(得分:0)

你好形式我所看到的所有月份都是05所以你不会得到不同的结果......我改变了我的演示中的日期,我得到了这个

$dir = new DirectoryIterator('PATH_TO_SQL_DIR');
$list = array();
foreach($dir as $file)
{
    if($file->isDot())
        continue;

    list($prifix,$surfix) = explode("-", $file->getFilename(),2);
    $date = DateTime::createFromFormat("Ymd", $prifix);
    $year = $date->format("Y");
    $month = $date->format("M");

    if(!isset($list[$year]))
    {
        $list[$year] = array();
    }

    if(!in_array($month, $list[$year]))
    {
        $list[$year][] = $month;
    }
}

echo "<pre>" ;
print_r($list);

输出

Array
(
    [2008] => Array
        (
            [0] => May
            [1] => Dec
        )

    [2009] => Array
        (
            [0] => May
        )

    [2010] => Array
        (
            [0] => May
        )

    [2011] => Array
        (
            [0] => May
        )

    [2012] => Array
        (
            [0] => Jan
            [1] => Feb
            [2] => May
            [3] => Dec
        )

)

你不能用它来建立你想要的任何类型的链接......

答案 2 :(得分:0)

我为你创建了一个脚本,我的帮助。 它不是递归的,但我认为它做你想要的,你根本不需要递归。 请将目录路径/脚本名称等更改为您的,它将适用于您。

$dir = scandir('myfiles');
$prevyear=0;
$prevmonth=0;
$prevday=0;

foreach ($dir as $file) {

if ($file!='.' && $file!='..') {

    if (isset($_GET["year"]) && isset($_GET["month"]) && isset($_GET["day"])) { //if all three is set show file

        if (preg_match('/^'.$_GET["year"].$_GET["month"].$_GET["day"].'/',$file,$match)) {
            echo '<a href="'.$file.'">'.$file.'</a><br />';
        }

    } else if (isset($_GET["year"]) && isset($_GET["month"])) { //if only year and month set show days
        if (preg_match('/^'.$_GET["year"].$_GET["month"].'/',$file,$match)) {
            $day = preg_replace(array('/^\d{6}/','/\-.*?$/'),'',$file);
            if ($day!=$prevday) {
                echo '<a href="script.php?year='.$_GET["year"].'&month='.$_GET["month"].'&day='.$day.'">' . $day . '</a><br />';
                $prevday=$day;
            }
        }   
    } else if (isset($_GET["year"])) { //if only year set show months
        if (preg_match('/^'.$_GET["year"].'/',$file,$match)) {
            $month = preg_replace(array('/^\d{4}/','/\d{2}\-.*?$/'),'',$file);
            if ($month!=$prevmonth) {
                echo '<a href="script.php?year='.$_GET["year"].'&month='.$month.'">' . $month . '</a><br />';
                $prevmonth=$month;
            }
        }   
    } else { //if nothing set show years
        $year = preg_replace('/\d{4}\-.*?$/','',$file);
        if ($year!=$prevyear) {
            echo '<a href="script.php?year='.$year.'">' . $year . '</a><br />';
            $prevyear=$year;
        }
    }
}

}

答案 3 :(得分:0)

非常感谢Baba提供的所有帮助。这是我最终用来解决问题的代码。

$dir = new DirectoryIterator($_SERVER['DOCUMENT_ROOT'] . 'sqlbackup/');
$list = array();
foreach($dir as $file)
{
    if($file->isDot())
    continue;

    list($prifix,$surfix) = explode("-", $file->getFilename(),2);
    $date = DateTime::createFromFormat("Ymd", $prifix);
    $year = $date->format("Y");
    $month = $date->format("m");
    $day = $date->format("d");

    if(!isset($list[$year]))
    {
        $list[$year] = array();
    }
    if(!in_array($day, $list[$year][$month][$day]))
    {
        $list[$year][$month][$day] = $day;
    }
}
echo "<pre>" ;

foreach (array_keys($list) as $value)
{
    Print "<a href='myknowledge.php?mnpage=managedb&date=" . $value . "'>" . $value . "</a><br/>";
    if ($value == substr($_GET['date'], 0, 4))
    {
            foreach (array_keys($list[$value]) as $value2)
            {
            Print "&nbsp;&nbsp;&nbsp;&nbsp;<a href='myknowledge.php?mnpage=managedb&date=" . $value . $value2 ."'>" . $value2 . "</a></br/>";
            }
    }
}                               
//print_r($list);