【发布时间】:2015-09-06 18:23:50
【问题描述】:
我有一个程序,其中一个函数使用一系列点等号连接分配返回一个相当大的 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,因为我现在可以看到实际上没有办法选择 正确 解决方案,因此删除它为时已晚(也许发到php mailing list 会更合适),我至少会尝试让它更有用。
花了 30 分钟调试一个脚本,其中一个 table 是通过使用“点等于”方法连接 HTML、text 和 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 classes 和 ids,以及许多变量,因此到处都有大量的单引号、双引号和点。现在,我希望能够根据用户输入在其上呈现不同的变体,并且将它的多个版本用test 子句分隔,或者在整个过程中进行测试可能会更糟。
询问HTML table generator class 会更合适,但也离题了。那里的选项包括相当轻量级的:htmlgen,更强大的Cellbrush 和 DynaWeb 的Table Class,据我所知,这也是相当轻量级的。
正如下面的一个答案所述,.= 是一种合理的方法,如果表格不太复杂,并且如果我只是将每一行的长度缩短,问题就会更加明显。事实上,锚点的开始标签几乎从页面边缘掉了下来。
在下面的答案(带有链接)中指出,用于分离逻辑、标记和数据的其他选项将使用模板引擎或使用 php 的 DOM 类 (tutorial)。 Heredoc 还会稍微清理一些冗余和多引号。
【问题讨论】:
-
在 php 中有 10 多种方法可以做任何事情。这里没有真正的问题需要回答
-
@Anonymous 我只是觉得这样做很容易打错字或看不到东西。
-
@Dagon 我知道有多种(甚至可能有 10 打)方法可以做到这一点,我愿意接受这个问题对于这个论坛来说可能过于开放,但即使别无选择解决方案是共享的,我会分享我想出的任何东西,也许它会对某人有用。
-
这不是论坛,这也许是重点,它是一个问答网站
-
打算研究使用dyn-web.com/php/table_class,stackoverflow.com/questions/2108212/… 有一些建议。 @Dagon 另一个问题也被一些人认为是题外话,但仍然非常有用。我正在认真考虑删除这个问题,但似乎应该在某个地方有一个地方。你会建议我删除它 - 并可能将其移至我的博客吗?将在 Meta 中询问...
标签: php arrays object return string-concatenation