PHP递归foreach循环

PHP递归foreach循环,php,tree,foreach,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 2012

我有一个目录中的文件列表,格式为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);
}
if($handle=opendir($\u SERVER['DOCUMENT\u ROOT'].'sqlbackup/'))
{
while(false!==($entry=readdir($handle)))
{
$isYearfound='false';
//$dirlist=array();
如果($entry!=”)和($entry!=”))
{
foreach($dirarray作为$dirarrayyear)
{
if(substr($entry,0,4)=$dirarrayyear)
{
$isYearfound='true';
}
}
如果($isYearfound=='false')
{
$dirarray[]=substr($entry,0,4);
打印“
”; } //打印$entry。“
”; } } closedir($handle); }
所以第一部分看起来不错。但是您可能希望在URL中传递年份和月份,以便代码随后比较文件名的前6个字符,然后对于生成的URL,它将传递完整的8个字符

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

您好,我一个月看到的都是
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);

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

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

$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);
$dir=scandir('myfiles');
$prevyear=0;
$prevmonth=0;
$prevday=0;
foreach($dir作为$file){
如果($file!='.&&$file!='..')){
if(isset($年)&&isset($月)&&isset($日){//如果三者都设置为show file
if(preg_match(“/^”。$获取[“年”]。$获取[“月”]。$获取[“日”]。/”,$file,$match)){
回声“
”; } }else if(isset($_GET[“year”])和&isset($_GET[“month”]){//如果仅年和月集显示天 if(preg_match('/^'.$获取[“年”].$获取[“月”]./',$file,$match)){ $day=preg\u replace(数组('/^\d{6}/','/\-.*?$/'),'$file); 如果($day!=$prevday){ 回声“
”; $prevday=$day; } } }else if(isset($\u GET[“year”]){//if只有year set显示月份 if(preg_match(“/^.”$\u GET[“year”]./”,$file,$match)){ $month=preg_replace(数组('/^\d{4}/','/\d{2}\-.*?$/'),''.$file); 如果($month!=$prevmonth){ 回声“
”; $prevmonth=$month; } } }否则{//如果没有设置,则显示年份 $year=preg_replace('/\d{4}\-.*?$/',''.$file); 如果($year!=$prevyear){ 回声“
”; $prevyear=$year; } } }

}非常感谢爸爸的帮助。这是我最后用来解决这个问题的代码

$dir=newdirectoryIterator($\u服务器['DOCUMENT\u ROOT'].'sqlbackup/');
$list=array();
foreach($dir作为$file)
{
如果($file->isDot())
继续;
列表($prifix,$surfix)=分解(“-”,$file->getFilename(),2);
$date=DateTime::createFromFormat(“Ymd”,$prifix);
$year=$date->format(“Y”);
$month=$date->format(“m”);
$day=$date->format(“d”);
如果(!isset($list[$year]))
{
$list[$year]=array();
}
如果(!在数组中($day,$list[$year][$month][$day]))
{
$list[$year][$month][$day]=$day;
}
}
回声“;
foreach(数组_键($list)作为$value)
{
打印“
”; 如果($value==substr($\u GET['date'],0,4)) { foreach(数组_键($list[$value])作为$value2) { 打印“
”; } } } //打印(列表);
上述代码工作正常。我现在想做的是将其放入递归循环中,但这超出了我的能力范围。上面的代码显示:2008 2009 2010 2011 2012我现在想显示2008 2009 2010 2011年1月2月2012年3月你是说2008年1月、2009年2月、2010年12月等等。。像这样的东西,你没有在那里做递归。没有直接(或间接)调用自身的函数。首先,页面将显示所有年份的列表,与当前显示的2008年、2009年、2010年、2011年和2012年相同。然后,如果有人点击2011,它将扩展显示可用月份,如果该月份存在备份。因此,它可以显示2008年2009年2010年2011年1月至2012年4月至5月。它从文件名$entry中获取此信息,0,4显示年份,然后$entry,4,2显示月份。代码
$\u SERVER['DOCUMENT\u ROOT']sqlbackup/“
表示您正在将SQL备份存储在可公开访问的web目录中。。。你确定这是你想做的事吗?是的,没错。我能做到。但我的问题在于,如果2011年在我的$GET['date']变量中,我如何列出所有年份,因为它们现在出现了,但到了2011年,在继续列出可用年份之前,我还要列出所有可用的唯一月份。好家伙,爸爸,我开始认为我没有很好地解释。明天早上我会重新看一看你的代码,非常感谢。另外,我不介意月份以数字形式显示,我只是觉得在论坛上解释会更容易。你可以将它更改为你想要的。。这就是为什么我让它简单而灵活。。。你不需要递归。。为了实现你的愿望,爸爸。头号人物。我现在已经有了一个数组,距离我需要它的时间还有一半。我得想办法
$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;
        }
    }
}
$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);