使用一个函数来减少重新编写代码的次数,但对输出的更改半显著


Using a function to reduce re-writing code but changing the output semi-significantly

好吧,我有一个函数可以绘制链接,就像网页上的选项卡一样。基本上,我有一系列链接用作标签,所有这些都是:

$aTabs[] = array("Mode" => "something", "Title" => "Something Else");

一旦我添加了所有的标签,我想使用这个功能来打印它们:

function drawTabs($aTabs, $sFilename) {
global $iMode;
foreach ($aTabs as $aTab) {
    $sClass = "Tab";
    if ($iMode == $aTab["Mode"]) {
        $sClass .= " CurTab";
    }
    echo "<a class='"{$sClass}'" href='"{$sFilename}?Mode={$aTab["Mode"]}'">{$aTab["Title"]}</a>'n";
}

}

所以这看起来很好,很漂亮。它很好用。

我还想在网站的另一部分使用它,它使用URL重写来使事情看起来更整洁。在站点的那个部分,输出需要是

echo "<a class='"{$sClass}'" href='"{$sFilename}/{$aTab["Mode"]}/'">{$aTab["Title"]}</a>'n";

我正在考虑添加一个字符串替换,它可以做这样的事情:

str_replace("[mode]", $aTab["Mode"], $sFilename);

这样我就可以打电话给

drawTabs($aTabs, "/some/place/on/my/site/[mode]/");

并且很可能添加一个条件,这样如果$sFilename中没有"[mode]",它只会使用"?"将其添加到末尾?Mode=$aTab["Mode"]'。

我的问题是,我的逻辑似乎正确吗,或者有更简单的方法吗?

解决方案可以是类似于的东西

function drawTabs($aTabs, $sFilename, $sFormat = null) {
    global $iMode;
    $sFormat = $sFormat ?: "<a class='"[class]'" href='"[fileName]?Mode=[mode]'">[title]</a>'n";
    foreach ($aTabs as $aTab) {
        $sClass = "Tab";
        if ($iMode == $aTab["Mode"]) {
            $sClass .= " CurTab";
        }
        $replacements = array(
            '[class]' => $sClass,
            '[fileName]' => $sFilename,
            '[mode]' => $aTab["Mode"],
            '[title]' => $aTab['Title'],
            );
            echo strtr($sFormat, $replacements);
    }
}

然后使用

$sFormat = "<a class='"[class]'" href='"[fileName]/[mode]/'">[title]</a>'n";
drawTabs($aTabs, $sFilename, $sFormat);