0

我正在创建一个非常大的页面,在各个部分需要循环遍历这样的数据数组:

$processed = array();
foreach( $data as $program )
{
    if( $program['f_enabled'] == 'N' ) continue;
    $pid = $program['f_programId'];
    if( !array_key_exists($pid, $processed) )
    {
        /**
         *  Do things with $pid and $program['f_foobar'], including
         *  ?>
         *      <span>HTML with <?=$inlined_vars?></span>
         *  <?php
         */
        $processed[] = $pid;
    }
}

这让我想起了 WordPress Loop。我知道我可以将所有循环压缩为一个,将 HTML 输出存储在变量中并在最后将它们拼凑在一起,但我强烈希望代码与围绕它的 HTML 保持一致。

我怎样才能排除外面的一切?即使它像 hacky 一样:

MY_HORRIFYING_MACRO
{
        /**
         *  Do things with $pid and $program['f_foobar'], including
         *  ?>
         *      <span>HTML with <?=$inlined_vars?></span>
         *  <?php
         */
}

我不关心这里的正确性——我只需要这个演示工作,并且让代码在演示文稿中从上到下可读,并同步了解页面上的其他内容。最好与 PHP 5.3 兼容——不肯定演示服务器将运行 PHP 5.4+——但如果存在使用 PHP 5.4+ 结构的解决方案,请无论如何分享。谢谢你。

4

3 回答 3

1

除了创建一个新的控制结构(就像在 Ruby 中那样),您可以使用更多样板但更惯用的 PHP 来做一些事情,如下所示:

$processed = array();
function preloop($program) {
    if( $program['f_enabled'] == 'N' ) return true;
    $pid = $program['f_programId'];
    if( !array_key_exists($pid, $processed) )
    {
        $processed[] = $pid;
        return false;
    }
    return true;
}
foreach( $data as $program ) {
    if (preloop($program))
        continue;

    // do things with program
}
// somewhere else
foreach( $data as $program ) {
    if (preloop($program))
        continue;

    // do things with program
}
于 2015-11-10T23:58:46.183 回答
0

您不能在 中做类似的事情PHP,但要在HTML使用类似Twig或类似的东西时显示数据处理。

于 2015-11-10T23:56:54.043 回答
0

通过使用回调,我能够得到我想要的东西。

首先,定义包装器(“宏”)函数,如下所示:

function my_macro($data, $fn)
{
    foreach( $data as $program )
    {
        if( $program['f_enabled'] == 'N' ) continue;
        $pid = $program['f_programId'];
        if( !array_key_exists($pid, $processed) )
        {
            call_user_func($fn, $program, $pid);
        }
    }
}

$program所以在上面,我传递$pid给一个尚未定义的回调函数,因为这两个变量总是需要的,并且经常需要。

要实际使用此构造,只需执行以下操作:

my_macro(function($program, $pid)
{
    /**
     *  Do things here, including
     *  ?>
     *      <span>HTML with <?=$pid?> and <?=$program['title']?></span>
     *  <?php
     */
});

您可以将其分散在页面中任何您喜欢的位置。$program除了和之外,您当然可以拥有任意数量的常用变量$pid

我仍然建议在问题的评论中阅读@Marty 的建议,以获得适当的、非骇人听闻的方法。但是,是的,这就是我所做的。

于 2015-12-09T05:00:59.487 回答