我正在创建一个非常大的页面,在各个部分需要循环遍历数据数组,如下所示:
$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+结构存在解决方案,请分享。谢谢。
答案 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的建议,以获得适当的,非黑客的方法。但是,是的,这就是我所做的。