有没有办法创建一个" custom" PHP中的循环或控制结构?

时间:2015-11-10 23:49:43

标签: php loops control-structure

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

$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循环。我知道我可以将所有循环压缩成一个,将HTML输出存储在变量中并在最后拼凑它们,但我强烈希望代码与围绕它的HTML一致。

如何分析外面的一切?即使它像黑客一样:

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+结构存在解决方案,请分享。谢谢。

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

您无法在PHP中执行此类操作,但是要处理要在HTML中显示的数据,请使用Twig或类似的内容。

答案 2 :(得分:0)

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

首先,定义包装器(&#34;宏&#34;)函数,如下所示:

anyInt()

因此,在上文中,我将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之外,您当然可以拥有任意数量的常用变量。

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