PHP foreach表现奇怪

时间:2012-10-09 11:48:31

标签: php foreach

我有一个名为$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;
}

但它的表现很奇怪,第3行的echo给了我这个:

template.header
error
error

第三个必须是emails.addEmail,但它与第二个重复。

有谁能告诉我我的代码有什么问题?

更新:我删除了@并将其替换为if (count($parts) > 1)。抱歉,那些家伙。但它与我的问题没有任何关系!还需要帮助......

更新2:我在此代码之前的某处使用了$block变量,它通过引用连接到另一个东西。通过更改变量名来解决问题。谢谢你们的帮助。

1 个答案:

答案 0 :(得分:2)

我的第一印象是某个(包含的)文件以某种方式操纵$blocks数组或$block本身。你应该避免以这种方式引用变量;保持变量接近其使用范围。

我发现的其他问题:

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

应该是:

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

因为只有$file包含至少两个元素才会设置$parts

另外要测试分割是否explode()返回了两个项目:

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

或者:

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

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