2012-10-09 65 views
1

我呼籲$blocks,關於它print_r()功能將導致數組:PHP的foreach舉止怪異

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

但它的在線行爲異常和echo 3給我這個:

template.header 
error 
error 

第三個必須是emails.addEmail但它重複第二個。

誰能告訴我我的代碼有什麼問題嗎?

更新:我刪除了@並將其替換爲if (count($parts) > 1)。對不起,那些傢伙。但它與我的問題沒有任何關係!仍然需要幫助...

更新2:我在此代碼之前的某處使用$block變量,它通過引用連接到另一個事物。通過更改該變量名稱可以解決問題。謝謝你們的幫助。

+3

如果你離開了'include'陳述會發生什麼? –

+0

@Jack測試它..它工作正常,不包括...請參閱:http://codepad.viper-7.com/sRIxMT – Baba

+0

@Jack哇!我改變了包括回聲,現在它顯示'/ var/www/newsletter/blocks/template/header.php' 3次! –

回答

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

+0

當你說'你應該避免以這種方式改變全局變量'時,你是什麼意思?'? –

+0

@faridv你看過那些包含的文件,看看他們在做什麼? –

+0

他們現在是空的!我的意思是它們包含一堆HTML代碼,而不是一行PHP。 –