-1

我在目录中有一个格式为 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

4 回答 4

0

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

first pass date=2008
second pass date=200805
third pass date=20080501
于 2012-05-08T16:19:00.557 回答
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
        )

)

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

于 2012-05-08T16:21:28.230 回答
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;
        }
    }
}

}

于 2012-05-08T17:15:52.867 回答
0

非常感谢巴巴的所有帮助。这是我最后用来解决问题的代码。

$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);
于 2012-05-09T09:08:06.370 回答