【问题标题】:Alternative to concatenating $return string to build HTML table [closed]连接 $return 字符串以构建 HTML 表的替代方法 [关闭]
【发布时间】: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 方法来处理这个问题,但不确定是否应该使用我将每个项目添加到的 arrayimplode/join,也许使用对象会有意义。

我在 Google 上搜索了一下,但运气不佳,希望 SO 社区提供一些意见。

编辑:

不确定是否有任何方法可以使这篇文章成为 On-Topic,因为我现在可以看到实际上没有办法选择 正确 解决方案,因此删除它为时已晚(也许发到php mailing list 会更合适),我至少会尝试让它更有用。

花了 30 分钟调试一个脚本,其中一个 table 是通过使用“点等于”方法连接 HTMLtextvariable 组件生成的,并且其中一个错误导致了每个文本要呈现为锚点的元素 (&lt;a&gt;some text&lt;/a&gt;)。在删除所有 javascript(我预计会以​​某种方式在 DOM 元素中生成锚标记)后,在以下行中追踪了该错误:

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

错误在行尾:&lt;a/&gt;。哎呀。

这是一个相当长的表格,其中包括许多 JavaScript 使用的 CSS classesids,以及许多变量,因此到处都有大量的单引号、双引号和点。现在,我希望能够根据用户输入在其上呈现不同的变体,并且将它的多个版本用test 子句分隔,或者在整个过程中进行测试可能会更糟。

询问HTML table generator class 会更合适,但也离题了。那里的选项包括相当轻量级的:htmlgen,更强大的Cellbrush 和 DynaWeb 的Table Class,据我所知,这也是相当轻量级的。

正如下面的一个答案所述,.= 是一种合理的方法,如果表格不太复杂,并且如果我只是将每一行的长度缩短,问题就会更加明显。事实上,锚点的开始标签几乎从页面边缘掉了下来。

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

【问题讨论】:

  • 在 php 中有 10 多种方法可以做任何事情。这里没有真正的问题需要回答
  • @Anonymous 我只是觉得这样做很容易打错字或看不到东西。
  • @Dagon 我知道有多种(甚至可能有 10 打)方法可以做到这一点,我愿意接受这个问题对于这个论坛来说可能过于开放,但即使别无选择解决方案是共享的,我会分享我想出的任何东西,也许它会对某人有用。
  • 这不是论坛,这也许是重点,它是一个问答网站
  • 打算研究使用dyn-web.com/php/table_classstackoverflow.com/questions/2108212/… 有一些建议。 @Dagon 另一个问题也被一些人认为是题外话,但仍然非常有用。我正在认真考虑删除这个问题,但似乎应该在某个地方有一个地方。你会建议我删除它 - 并可能将其移至我的博客吗?将在 Meta 中询问...

标签: php arrays object return string-concatenation


【解决方案1】:

如果您想要一种经典的方式来执行此操作,请查看 DomDocument http://www.php.net/manual/en/class.domdocument.php

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

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

【讨论】:

    【解决方案2】:

    一种选择是使用模板引擎,而不是将 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));
    

    【讨论】:

    • 这是一个有趣的想法。由于它是用于 wordpress 插件的,因此我需要研究它是否会使插件膨胀。
    【解决方案3】:

    在 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>
    

    【讨论】:

      猜你喜欢
      • 2014-10-29
      • 2013-02-23
      • 1970-01-01
      • 2012-03-05
      • 2021-11-06
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多