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 ループを思い起こさせます。すべてのループを 1 つに圧縮して、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 以降のコンストラクトを使用したソリューションが存在する場合は、とにかく共有してください。ありがとうございました。

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);
        }
    }
}

したがって、上記では、これら 2 つの変数が常に必要であり、頻繁に必要とされるため、まだ定義されていないコールバック関数に$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 に答える