19332


変数animalsにHTMLの雛形を作っておいて、ホイールした時に雛形内の変数を反映させたいです。

構文

[code]

    if(x == 0) {
        $animals = '<div>' . $lion . '</div>';
        for($i=0; $i<5; $i++) {
          $lion = 'ライオン';
          echo $animals;
        }
    }
    
[/code]

理想

[code]

    <div>ライオン</div>
    <div>ライオン</div>
    <div>ライオン</div>
    <div>ライオン</div>
    
[/code]

結果

[code]

    <div></div>
    <div></div>
    <div></div>
    <div></div>
    
[/code]

です

すみません、質問の説明の仕方がとても下手くそなんですが、実際は  
$animalsには100行のHTML、PHP関数が書いてあります。  
$lionにはwhile文の際に実行されるthe_content()によって$animalsの内容を反映することができます。

$animalsには100行を20回ほどループするので無駄が多くサイトM3-2XLARGEのスペックでも速度が重くなっています。

そこであらかじめテンプレートを作成しておいて、whileでループしても既に書き込まれたものを反映させるだけなので、この方法を探しています。


CC BY-SA 3.0
2015-11-25T11:16:18.837
19293
2015-11-27T06:59:33.357
2015-11-26T16:49:00.880
7973
7973
question
php
PHPで変数に変数を代入した時に反映されない


> `$animals = '<div>' . $lion . '</div>';`

右辺の `$lion` が評価され空文字になるため `$animals` の値は `<div></div>` になります。

質問のコードだけでは、何を求めているのか正直わかりませんが
[`eval`](http://php.net/manual/ja/function.eval.php) のような使い方を想定されてるように感じました。

evalは文字列をPHPコードとして解釈する関数です。変数を含める場合、意図しない操作が行われないことを必ず事前に確認する必要があります。[マニュアルにも記載があるように](http://php.net/manual/ja/function.eval.php)
**一般にevalの使用は勧められません** 。(この注記は元の回答者による物ではありません)

evalの例）

[code]

    <?php
        $animals = '<div>$lion</div>';
        for($i=0; $i<5; $i++) {
          if ($i % 2 == 0)
            $lion = 'ライオン';
          else
            $lion = 'にゃんこ';
          eval('echo "' . $animals . '\n";');    // echo "<div>$lion</div>\n";
        }
    ?>
    
[/code]

実行結果)

for の中で $lion の値が変わってもその都度、反映されるのが分かります。

[code]

    $ php eval.php
    <div>ライオン</div>
    <div>にゃんこ</div>
    <div>ライオン</div>
    <div>にゃんこ</div>
    <div>ライオン</div>
    
[/code]


CC BY-SA 3.0
2015-11-26T10:25:52.480
19328
2015-11-27T06:59:33.357
2015-11-27T06:59:33.357
5793
5008
19293
answer


`$animal`を関数にして呼び出してしまえばOKです。

[code]

    <?php
    
    $animals = function ($animal) {
        $_animal = htmlspecialchars($animal, ENT_QUOTES, 'UTF-8');
        return '<div>' . $_animal . '</div>';
    };
    
    for ($i=0; $i<5; $i++) {
        $lion = 'ライオン';
        echo $animals($lion) . PHP_EOL;
    }
    
[/code]

* * *

追記: 関数がお嫌いなら、`printf`とか:

[code]

    $div = '<div>%s</div>' . PHP_EOL;
    
    for ($i=0; $i<5; $i++) {
        $lion = 'ライオン';
        printf($div, $lion);
    }
    
[/code]


CC BY-SA 3.0
2015-11-26T11:14:48.923
19332
2015-11-27T02:45:22.463
2015-11-27T02:45:22.463
62
62
19293
answer


コメントなどを見ると「処理が遅くなる」ということを危惧されているようですが、いずれの方法をとるにしても、最低限「雛形から変更したHTML文字列を作成する」処理は必要になります。  
**存在しない文字列を出力することはできません。**

[code]

    <div>ライオン</div>
    <div>トラ</div>
    <div>チーター</div>
    
[/code]

このような出力をするには、

  * 雛形に「ライオン」を適用した文字列
  * 雛形に「トラ」を適用した文字列
  * 雛形に「チーター」を適用した文字列

をそれぞれ作成しなくていはいけません。  
これはテンプレートエンジンなどを利用する場合も同じです（表面上は見えなくても、内部で雛形に各動物の名前を適用した文字列を作成しているかと思います）

for文の中でそれぞれの動物の名前を適用した文字列を $animals
に代入するのがオーソドックスな解決案かと思いますが、雛形自体が100行近くあるのでしたら、雛形を変動する部分の前後で分けてみてはいかがでしょうか。

[code]

    if(x == 0) {
        $animalArray = array('ライオン','トラ','チーター')
        $before = '<div>';
        $after = '</div>';
    
        for($i=0; $i<3; $i++) {
          echo $before.$animalArray[$i].$after;
        }
    }
    
[/code]


CC BY-SA 3.0
2015-11-27T01:24:23.220
19354
2015-11-27T01:24:23.220
13128
19293
answer