连接$ return string以构建HTML表的替代方法

时间:2015-06-21 02:19:40

标签: php arrays object return string-concatenation

我有一个程序,其中一个函数使用一系列点等号连接分配返回一个相当大的HTML表:

function callme() {
    $return = '';
    $return .= '<table>';
    foreach ($foo as $bar => $bar){
      $return .= '<tr><td style="css">bla bla bla'.$bar.'</td>';
      $return .= '<td>more stuff, modal buttons</td></tr>';
      $return .= 'etc etc etc...';
    }
    $return .= '</table>';
return $return
}

我希望找到一个不太容易出错的WET方法来处理这个并且不确定它是否应该使用array我将每个项目添加到implode/join,也许使用对象会有意义的。

我已经google了一下,没有太多的运气,并且非常喜欢来自SO社区的一些意见。

编辑:

不确定是否有任何方法可以将此帖发布为On-Topic,因为我现在可以看到,实际上没有办法选择正确的解决方案,所以因为删除它已经太晚了(也许发布到Date.prototype.getFullYear()本来更合适),我至少会尝试使其更有用。

花了30分钟调试一个脚本,其中使用“dot equals”方法连接tableHTMLtext组件生成的variable,以及错误导致每个文本元素都呈现为锚点(<a>some text</a>)。删除所有的javascript后,我预计会以​​某种方式在DOM元素中生成锚标记,跟踪下面一行中的错误:

$return .= '<br/><div id="visitMBO" class="btn visitMBO" style="display:none"><a href="'.$eventLinkURL.'" target="_blank">Manage on MindBody Site<a/></div>';

错误位于该行的末尾:<a/>。糟糕。

这是一个相当长的表格,包括javascript使用的大量CSS classesid以及许多变量,所以有大量的单引号,双引号和点遍布这个地方。现在我希望能够根据用户输入呈现不同的变体,并将其中的多个版本用test子句分隔,或者在整个过程中进行测试可能会更糟。

询问php mailing list会更合适,但也会偏离主题。那里的选项包括相当轻量级的HTML table generator class,更健壮的htmlgen和DynaWeb的Cellbrush,据我所知,它的重量也相当轻。

如下面的一个答案所述,如果表格不太复杂,.=是一种合理的方法,如果我只是将每一行保持在较短的长度,那么问题会更明显。实际上,锚点的开始标记几乎从页面边缘掉落。

在下面的答案(带链接)中注明,用于分离逻辑,标记和数据的其他选项将使用模板引擎或使用php的DOM类(Table Class)。 Heredoc还会清理一些冗余和多个引号。

3 个答案:

答案 0 :(得分:1)

如果您想要有条理的方法,请查看DomDocument http://www.php.net/manual/en/class.domdocument.php

您可以使用它以非常结构化的方式构建HTML。但是,在这个例子中,我并不认为他们一定是解决问题的正确方法。你应该找到一种你感觉舒适的风格,并对你和你的团队有意义;这是帮助避免错误代码的最佳方法。

对我来说,我通常只是使用。=编写代码,只要代码相当小就完全如此。这是一种非常容易阅读的方法。如果我可以浏览一段代码并理解它而不用考虑其正常代码。

答案 1 :(得分:1)

一种选择是使用模板引擎,而不是将HTML代码直接放在PHP函数中。一个例子是mustache

这将允许您在单独的文件中构建HTML并将数据传递给它。

您的模板文件可能如下所示:

<table>
    {{# foo }}
        <tr>
            <td>{{ bar }}</td>
        </tr>
    {{/ foo }}
</table>

然后您将从中获取HTML字符串:

$m = new Mustache_Engine(array(
    'loader' => new Mustache_Loader_FilesystemLoader(dirname(__FILE__) . '/templates'),
));

$m->render('table_template', array('foo' => $foo));

答案 2 :(得分:1)

在PHP中使用字符串的方法有很多种。值得注意的是,如果你想要用字符串连接一个大的连续的HTML块,那么在没有引号的情况下这样做的一种有用方法是使用Heredoc。例如

function callme(&$rows) {
    $return = '<table>' . PHP_EOL;
    foreach ($rows as $row){
      // Start a heredoc-delimited string
      $return .= <<<EOD
      <tr>
         <td>Movie name: "$row[0]"</td>
         <td>Review: $row[1]</td>
         <td>IMDB rating: $row[2]</td>
         <td>Summary: "$row[0]" was $row[1] with a rating of $row[2]</td>
      </tr>
EOD;
// End a heredoc-delimited string (must be on its own line)
    }
    return $return . PHP_EOL . '</table>';
}

$arr = array(array("Fast 7", "awesome", "7.6"), array("Glitter", "horrible", "2.1"));
echo callme($arr);

<强>结果:

<table>
      <tr>
         <td>Movie name: "Fast 7"</td>
         <td>Review: awesome</td>
         <td>IMDB rating: 7.6</td>
         <td>Summary: "Fast 7" was awesome with a rating of 7.6</td>
      </tr>      <tr>
         <td>Movie name: "Glitter"</td>
         <td>Review: horrible</td>
         <td>IMDB rating: 2.1</td>
         <td>Summary: "Glitter" was horrible with a rating of 2.1</td>
      </tr>
</table>