0

getSettings() 似乎只读取并输出目录中的 1 个 settings.php 文件。如何让它读取和输出所有 settings.php 文件内容?

<?php 
$config = array("os"=>"windows","directory"=>"../Core-Stack/Themes/","ignore"=>array('_vti_cnf','cgi-bin','.','..')); 

function getSettings($dir, $issubdir = false) { 
    global $config, $SETTINGS; 
    if ($config['os'] == "unix") 
        $delimiter = "/"; 
    else if ($config['os'] == "windows") 
        $delimiter = "\\"; 
    if (!file_exists($dir) || !is_dir($dir) || !is_readable($dir)) { 
        echo "Error: \"$dir\" is not a directory, or I cannot read it properly."; 
        return 0; 
    } else if ($od = opendir($dir)) { 
        while (($file = readdir($od)) !== false) { 
            if (!in_array($file, $config['ignore'])) { 
                $path = $dir . $delimiter . $file; 
                if (is_dir($path)) 
                    getSettings($path, true); 
                elseif (is_file($path) && $file == "settings.php") 
                    include ($path); 
            } 
        } 
        closedir($od); 
    } 
} 

getSettings($config['directory'], true); 
echo "Theme Name: "; 
echo $SETTINGS['theme_name']; 
echo "<br>"; 
echo "Theme Creator: "; 
echo $SETTINGS['theme_creator']; 
echo "<br>"; 
echo "Theme Version: "; 
echo $SETTINGS['theme_version']; 
echo "<br>"; 
echo "Theme Creation Date: "; 
echo $SETTINGS['theme_creation_date']; 
?>
4

2 回答 2

0

您应该在递归之前存储目录内容,您的 else-if 块应该是这样的:

else if ($od = opendir($dir)) { 
        $subdirs = array();
        while (($file = readdir($od)) !== false) { 
            if (!in_array($file, $config['ignore'])) { 
                $path = $dir . $delimiter . $file; 
                if (is_dir($path)) $subdirs[] = $path;
                elseif (is_file($path) && $file == "settings.php") include ($path); 
            }           
        }
        closedir($od);
        foreach($subdirs as $subdir)
            getSettings($subdir, true);
    }
于 2011-04-28T13:53:57.870 回答
0

很可能您的“设置”文件正在以某种方式定义设置$SETTINGS = array(...);,当然这样您只会看到最新包含的文件中的内容。您可以在不重新制作整个事物的情况下在这里做的是:不改变settings.php

//...
elseif (is_file($path) && $file == "settings.php") {
    $OLD_SETTINGS = $SETTINGS;
    include ($path);
    $SETTINGS = array_merge($OLD_SETTINGS, $SETTINGS);
}
//...

或者如果您可以更改settings.php文件:

//...
elseif (is_file($path) && $file == "settings.php") {
    $SETTINGS = array_merge($SETTINGS, include ($path));
}
//...


//----in settings.php
return array(
    'option' => 'foobar',
    //...
);

当然,如果我理解你的意图是正确的。如果不是 - 那么请编辑您的问题并添加更多详细信息。

更新

scandir如果树非常深,您也可以使用更少的行来适应函数并防止堆的潜在问题,如下所示:

function getSettings($dir, $issubdir = false) { 
    global $config, $SETTINGS; 
    if (!file_exists($dir) || !is_dir($dir) || !is_readable($dir)) { 
        echo "Error: \"$dir\" is not a directory, or I cannot read it properly."; 
        return 0; 
    } else if ($files = scandir($dir)) { 
        foreach ($files as $file) { 
            if (in_array($file, $config['ignore'])) continue;

            $path = $dir . DIRECTORY_SEPARATOR . $file; 
            if (is_dir($path)) 
                getSettings($path, true); 
            elseif (is_file($path) && $file == "settings.php") 
                $SETTINGS = array_merge($SETTINGS, include ($path));
        }
    } 
} 
于 2011-04-28T13:33:55.230 回答