1

$blocksそのprint_r()関数と呼ばれる配列があり、次のようになります。

Array ( [0] => template.header [1] => error [2] => emails.addEmail )

これが私のコードです:

if(count($blocks)) {
    foreach ($blocks as $block) {
        echo $block;
        $parts = explode('.', $block);
        if (count($parts) > 1) {
            list($folder, $file) = $parts;
            $folder = $folder . '/';
            echo BASE . '/blocks/' . $folder . $file . '.php';
        } else {
            echo BASE . '/blocks/' . $file . '.php';
        }
    }
    $parts = null;
}

しかし、それは奇妙に動作していて、echo3行目で私にこれを与えます:

template.header
error
error

3つ目は必要ですemails.addEmailが、2つ目と重複しています。

誰かが私のコードの何が問題なのか教えてもらえますか?

更新:削除@して、に置き換えましたif (count($parts) > 1)。あの人たちについてごめんなさい。しかし、それは私の問題とは何の関係もありません!まだ助けが必要です...

更新2:$blockこのコードの前のどこかで変数を使用していましたが、別のものを参照して接続されていました。その変数名を変更することで問題は修正されました。皆さんの助けに感謝します。

4

1 に答える 1

2

私の最初の印象は、何らかの (含まれている) ファイルが何らかの形で$blocks配列または$blockそれ自体を操作しているということでした。そのように変数を参照することは避けるべきです。変数の変更を、それらが使用されているスコープの近くに保ちます。

私が見つけた他の問題:

echo BASE . '/blocks/' . $file . '.php';

次のようにする必要があります。

echo BASE . '/blocks/' . $block . '.php';

少なくとも 2 つの要素が含まれている$file場合にのみ設定されるためです。$parts

また、分割がexplode()2 つのアイテムを返したかどうかをテストするには、次のようにします。

if (isset($parts[1])) { ... }

または:

if (count($parts) > 1) { ... }

作業例: http://codepad.viper-7.com/6oNhBv

于 2012-10-09T11:55:36.633 に答える