我如何在数组中运行PHP代码?

时间:2013-04-17 13:23:30

标签: php arrays while-loop

我正在使用这个PHP代码(来自这里的问题):

<?php

define(TEMPLATES_LOCATION, 'templates/');

function TemplateFunction ($template, $replaces) {
    $template = file_get_contents(TEMPLATES_LOCATION . $template);
    if (is_array($replaces)) {
        foreach($replaces as $replacekey => $replacevalue){
            $template = str_replace('{$' . $replacekey . '}', $replacevalue, $template);
        }
    }
    return $template;
}

$keys = array(
    'TITLE' => 'This is page title',
    'HEADER' => 'This is some header',
    'GALLERY' => 'php while loop here'
);

echo TemplateFunction('body.tpl', $keys);

?>

我的模板文件的设置方式是以下HTML:

<body>
<div id="gallery">{GALLERY}</div>
</body>

所以在{GALLERY}所在的地方,php脚本应该用我自动生成的<li><img src="images/'.$filename.'"/></li>替换它,这是在从mysql请求生成的while循环中运行的

我认为可行的是:

$keys = array(
        'TITLE' => 'This is page title',
        'HEADER' => 'This is some header',
        'GALLERY' => 'while($row = mysql_fetch_array($result)){<li><img src="'.$row['filename'].'"/></li>})'
);

但它没有:(

4 个答案:

答案 0 :(得分:1)

重新编写代码:

$keys = array(
        'TITLE' => 'This is page title',
        'HEADER' => 'This is some header',
        'GALLERY' => 'while($row = mysql_fetch_array($result)){<li><img src="'.$row['filename'].'"/></li>})'
);

我认为以这种方式将PHP代码嵌入到模板数据中是非常糟糕的做法。请允许我为您提供完全不同的解决方案......

首先,我们需要封装代码。您上面显示的代码正在尝试从$result变量中获取数据,但$result本身显然是在其他地方设置的。这并不好,因为如果我们想要改变图库功能的工作方式,我们需要搜索整个代码以找到它的不同部分。

相反,您应该将该功能编写为自包含函数(或者如果某个函数对于单个函数来说太复杂而编写),这将加载数据并对其进行处理。

让我们调用该函数loadGallery()。它可能看起来像这样:

function loadGallery() {
    $output = '';
    $result = mysql_query('...gallery query here...');
    while($row = mysql_fetch_array($result)) {
        $output .= "<li><img src='{$row['filename']}'/></li>";
    }
    return '<ul>'.$output.'</ul>';
}

显然,它可能比那复杂得多(例如,您可能想要对其进行分页,或者提供类别选项;这些选项将作为函数的参数编写)。为简洁起见,我也没有写过任何错误检查等。

现在您已经拥有了该功能,您可以将其插入模板引擎。您需要在模板中引用该功能。

您目前拥有此{TITLE}之类的模板标记。在您的代码中,这些标记使用str_replace()与纯文本交换。没关系。但在这种情况下,我们现在想要调用一个函数,所以我们需要有一种不同的标记。

让我们像这样编写图库标记:{FUNCTION:loadGallery}而不是{GALLERY}

现在,您可以在模板引擎中添加一些代码来查看这些{function:}标记,并将其替换为函数调用。 (您当然可以保留现有的简单str_replace()方法)

$funcReplaces = array(   //similar to your existing $keys array, but for allowed functions
    'loadGallery'
);

foreach($funcReplaces as $replaceFunc){
    $template = str_replace('{function:' . $replaceFunc . '}', $replaceFunc(), $template);
}

这将运行该函数并将输出放入模板中。

这样就可以为你解答问题。

然而,我应该指出的是,从技术和安全角度来看,编写模板引擎时需要考虑其他问题 lot 。以上描述了解决手头特定问题的基本方法,但它并非一个梦幻般的全能舞蹈模板引擎。它仍然只是一个非常基本的。

这很好,如果这就是你所需要的,但是如果你期望这个系统能够增长,那么值得注意的是,整个领域都是这个问题,其他人已经解决了,并且解决得很好。 PHP有几种非常好的模板引擎。我建议你最好的做法是调查其中的一些,也许可以使用其中一种,而不是自己编写。

你可以尝试一些:

希望有所帮助。

答案 1 :(得分:0)

您不能“在数组中执行PHP代码”。您只需以编程方式构建阵列:

while (/* something */) {
    $keys['GALLERY'][] = $something;
}

答案 2 :(得分:0)

我发现以下代码是我写的解决问题的正确方法:

$gallery = array();
while($row = mysql_fetch_assoc($result))
{
   $gallery[] = '<li><a href="'.$row['gallery_image_filename'].'" target="_blank"><img src="'.$row['gallery_image_filename'].'" width="'.$final_image_width.'" height="auto" style="margin: '.$other_margin.'px '.$gallery_image_margin.'px '.$other_margin.'px 0px"/></a></li>';
}
$gallery = implode(' ', $gallery);

然后我可以将我的$ gallery变量连接到'GALLERY' => 'value'值,并根据需要输出所有数据库结果。感谢大家的帮助:))

答案 3 :(得分:-2)

好吧,您可以使用__toString魔术方法创建class,该方法将处理您图库中的所有图片,然后返回字符串。

   class TemplateGallery{
       private $images = array();

       public function addImage($src){
           $images[] = $src;
       }

       public function __toString(){
           $str = "";
           foreach($images as $image){
               $str .= sprintf('<li><img src="%s"></li>',$image);
           }
           return $str;
       }
   }

好吧,正如评论中的人说的那样,它太“难”了,所以,你可以使用“预处理”功能,处理图像数组,然后返回模板字符串。

$images = array(/* Put images src here */);
function processGallery($images){
    $str = "";
    foreach($images as $image){
        $str .= sprintf('<li><img src="%s"></li>',$image);
    }
    return $str;
}

然后在array上调用该功能。