Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在模板中使用循环_Php_Templating - Fatal编程技术网

Php 在模板中使用循环

Php 在模板中使用循环,php,templating,Php,Templating,我开始写我自己的小规模框架,我已经得到了它的模板部分。到目前为止,我已经能够用以下代码进行简单的变量替换: public function view($page, $vars) { if(!file_exists('system/views/' . $page . '.php')) { trigger_error("No Template found", E_USER_ERROR); } $tempArray = file_get_content

我开始写我自己的小规模框架,我已经得到了它的模板部分。到目前为止,我已经能够用以下代码进行简单的变量替换:

public function view($page, $vars)
{
    if(!file_exists('system/views/' . $page . '.php'))
    {
        trigger_error("No Template found", E_USER_ERROR);
    }

    $tempArray = file_get_contents('system/views/' . $page . '.php');

    foreach($vars as $key => $value)
    {
        $tempArray = str_replace('{' . $key . '}', $value, $tempArray);
    }

    print $tempArray;
    unset($tempArray);
}

这很好,但我现在要寻找的是,如果我想循环显示数据库中未知数量的记录,我尝试了一些想法,但到目前为止似乎没有一个有效,因为Zed已经说过PHP有很多模板语言,最受欢迎的是,我不知道除了学习目的之外,重新发明轮子是否真的有意义。实际上,要执行的循环比替换元素要复杂得多。我很确定你可以用很多正则表达式来完成它,但在某个时候,你最终会编写自己的脚本语言(就像Smarty的家伙那样),解析你的视图文件,创建一个语法树,计算它并将它编译成一个新的PHP文件。这相当复杂,所以我建议要么使用现有的模板引擎,要么使用PHP作为模板语言本身(如果严格遵循可能有效的模式,尽管有很多关于该模式的讨论)

使用正则表达式,您可以解析{for…}{/for}之间的所有内容,以访问具有给定变量名的项,其中在{for and}之后出现变量定义,在}之后和{/for}之前出现html定义。这就像是一个foreach循环,你们甚至不能相互嵌套

{for item=$varname}
    <p>{item.othervalue}</p>
{/for}
{for item=$varname}
{item.othervalue}

{/for}
首先,您应该重新考虑变量重写。有几种情况下,当您的方法之间存在一些依赖关系时,它们并没有按预期结束。此外,无论变量是否在循环中,所有内容都会被替换

如果您想要类似{while(condition)}code{/while}的东西,您需要知道递归也是可能的,因此它不像匹配正则表达式那样简单

一个简单的方法如下:

  • 找到标记(变量whileloop)的开头并记住找到它的位置
  • 如果它是一个变量,并且您在最外部的范围内(不在循环中),则通过替换来处理它。调整你的指针,这样你就不会在事后阅读替换内容,以避免替换你不想替换的内容
  • 如果它是一个循环
    • 提取支架之间的条件并将其存储在其他位置
    • 另外,存储当前位置
    • 将令牌推送到堆栈上以记住当前递归级别
    • 当遇到{/while}标记时,从堆栈中移除标记
    • 现在以递归方式进行,将所有嵌套循环标记推送到堆栈上,并在结束时移除它们。当您再次处于最外层时停止
    • 评估循环的条件。只要是真的,就从源文本在开始标记和结束标记之间创建新副本,并使用递归处理它们
    • 连接中间结果并用此连接替换从{while}到{/while}的所有内容。调整指针,使其指向循环后面,然后继续:)
希望这有帮助。我知道这听起来有点痛苦,但是如果你理解了这个概念,你应该能够做到(虽然它不是超高效的,像smarty这样的编译模板引擎总是提前完成的,因为它们只解析一次模板文件,然后将其编译成PHP代码)


@Daff:您可以找到带有正则表达式的标记,但由于递归的原因,使用一个正则表达式来匹配整个循环构造是行不通的(除非您的正则表达式有一个递归扩展)。

如果您渴望了解这一点(就像我一样),您可以去-这是一个关于这一点的教程,但是你需要是plus会员才能阅读:)

有很多开放源码的PHP模板语言,为什么你不看看其中的一种呢?我主要是为了学习,当然肯定有一些方法可以做到这一点,而不需要去像这样的Extereame?我添加了一个小例子。但如果你真的想学,你可能想走到一个极端。。。最简单的方法是使用PHP作为模板语言,或者创建自己的模板引擎。谢谢你的例子,这似乎是我一直在寻找的路线。回复我知道,但我想我会让你知道,这确实有很大帮助,谢谢!