0

我创建了一些模板系统来帮助我以可换肤的方式输出数据库项目。它是这样工作的:

$tpl = "<html>
<body>
<div><span class="item">Favourite food:</span><span class="content">{item1}</span></div>
<div><span class="item">Hobby:</span><span class="content">{item2}</span></div>
<div><span class="item">Allergies:</span><span class="content">{item3}</span></div>
// up to 500 more lines like this
</body>
</html>";

$output = str_replace( 
array('{item1}','{item2}','{item3}') ) , 
array($database['item1'],$database['item2'],$database['item3']) , 
$tpl );

echo $output;

现在我的问题是:并非每个数据库项目都必然有内容 - 所以,目前我得到这样的输出

最喜欢的食物:香蕉 爱好:{item2} 过敏:苹果

有什么方法可以使用这种系统并省略没有数据库条目的行?输出应该是这样的:

最喜欢的食物:香蕉过敏体质:苹果

我怎么能做到这一点?

更新:描述文本也可能有所不同,因此我更新了示例代码。而且我想避免使用 foreach 或 for-loops,因为那样模板本身就被破坏了。我希望能够插入随机 HTML。目前使用 smarty 或其他模板系统是不可行的。但我可以提供带有描述的第三个数组。

更新 2:我认为 $output 上的 preg_replace 可能会起作用?所以这意味着“如果在 $output 上的某处有一个包含 {} 括号的 html 标记,那么将整个标记从 to 擦除(我相应地更新了我的代码)你怎么看?你知道任何可以做到这一点的 reg_expression ?

4

5 回答 5

2

此代码将起作用:

<?php

$database = array(
"item1" => "banana",
"item2" => "apple",
"item3" => "cherry",
);

$output = '<html>
<body>';

for($i=1;$i<500;$i++) //change 500 with the desired number or setup a dynamic variable
{
    if(isset($database['item'.$i])) //if the current item is set
    {
$output .= '<span class="item">Description for item '.$i.': </span><span class="content">'.$database['item'.$i].'</span>'; //append to $output
$output .= '<br />'; //Here I add a line break, remove if you don't want
    }
}
$output .= '</body></html>';

echo $output;

?>

您会看到,如果 $database 数组中不存在某个项目,它就不会被打印出来。当然,您可以删除代码开头的 $database 数组(此处用于测试目的)并使用您自己生成的 $database 数组。

在您的特定情况下:如果您想开发自己的模板引擎,您可以在模板中使用特殊字符串(您发明的)(例如{--ITEMS--}),然后在第二个 PHP 文件中处理这些字符串,该文件读取模板,找到字符串并用一些输出替换它们。为此,您在此处发布的代码中缺少的要点是输出的“构造”,它将替换模板中的固定字符串。您可以通过处理数据库并将结果(使用.=)附加到一个变量来构建输出,该变量在最后被打印出来或可用于替换您的固定字符串。

于 2012-11-20T21:02:26.203 回答
1

我倾向于维护一个你想要的值的数组(也可以来自一个数据库)并控制是否显示你的数据库结果(这里显示为 $row )。这样,您还可以组合在找到匹配项时显示的标签

$row= array(
"item1" => "banana",
"item2" => "apple",
"item3" => "cherry",
);

$items = array(
'item1'=>'Favourite Food', 
'item2'=>'Hobbies:',
'item3'=> 'Allergies'
);

foreach($items as $k=>$item){

if (isset($row[$k]) {
// concat a variable
$html .= $item . ' ' . $row[$k] . '<br />';
}


}

echo $html; // or whatever

与回复中显示的其他想法结合使用。

于 2012-11-21T22:37:21.503 回答
0

使用此代码:

$tpl = "<html><body>";
for($i=1;$i<500;$i++)
{
    if(isset($database['item'.$i]))
    {
    $tpl = $tpl.'<span class="item">Description for item '.$i.':</span><span class="content">{item'.$i.'}</span>';
    }
}    
$tpl = $tpl."</body></html>";

echo str_replace( 
array('{item1}','{item2}','{item3}') ) , 
array($database['item1'],$database['item2'],$database['item3']) , 
$tpl );
于 2012-11-20T20:20:44.207 回答
0

你看过 PHP Isset 吗?http://php.net/manual/en/function.isset.php还是空的?http://php.net/manual/en/function.empty.php

于 2012-11-20T20:19:37.460 回答
0

我实际上建议在数据库上使用 foreach 循环

$tpl = '';
foreach($database as $itemName => $value)
{
$tpl .= '<span class="item">Description for item '.$i.':</span><span class="content">{item'.$i.'}</span>';
}

可能需要适应它,但否则应该很好

于 2012-11-20T22:02:17.630 回答