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ループは避けたいと思います。ランダムなHTMLを挿入できるようにしたい。現時点では、smartyまたは別のテンプレートシステムを使用することはできません。しかし、3番目の配列に説明を提供することはできます。

更新2:$ outputのpreg_replaceでうまくいくかもしれないと思いましたか?つまり、「$ outputのどこかに{}ブラケットを含むhtmlタグがある場合は、タグ全体をからに消去します(それに応じてコードを更新しました)。どう思いますか?これを実行できる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-})で(あなたが発明した)特別な文字列を使用し、次にそれらの文字列を読む2番目のPHPファイルで処理することができますテンプレートは、文字列を見つけて、それらをいくつかの出力に置き換えます。これを行うために、ここに投稿したコードに欠けている主なポイントは、テンプレート内の固定文字列を置き換える出力の「構築」です。データベースを処理し、結果を( 。=を使用して)変数に追加することで出力を作成できます。この変数は、最後に出力されるか、固定文字列を置き換えるために使用できます。

于 2012-11-20T21:02:26.203 に答える
1

必要な値の配列を維持することをお勧めします (db から取得することもできます)。db の結果を表示するかどうかを制御します (ここでは $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

私は実際にデータベースで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 に答える
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 に答える