2010-12-15 141 views
0

我從多維數組中的給定值獲取密鑰。它工作正常,除了我似乎無法從我用來獲取密鑰的嵌套foreach循環外部訪問變量。從嵌套的foreach語句中訪問變量PHP

所以我的foreach循環是:($ name_books是多d數組,它包含3個較小的陣列)

foreach($name_books as $test) { 
    foreach ($test as $key => $value) { 
    $book_code = array_search($row['name'],$test); 
    echo $book_code; //just to see if it works, which it does 
    break; 
     } 
    } 
//But then if I go outside of the loop.. 

echo $book_code." is the book code"; // <--DOES NOT WORK 

所以我知道我處理變量的作用域的問題在這裏,我已經試過在foreach循環中聲明全局變量,但沒有任何效果。

我敢肯定,有一些荒謬的簡單,我錯過了!

編輯:

urg..I退後了一步,實現了別的東西, 這一切都是在while循環中(得到的東西從DB)發生

,使代碼更喜歡:如果不包括這個,我很關注這件小事,忘記備份並看看它適合哪裏。

回答

2

這與變量範圍無關,只要您發佈的內容與您在腳本中的內容完全相同即可。

我覺得問題是,你只是打破內循環。在外部循環的每次迭代中,$ book_code都會改變,所以你也需要停止外部循環。嘗試更改break;break 2;並查看它是否解決了您的問題。這導致它打破內部和外部循環。

編輯:我想你也可以簡化你的代碼:

foreach ($name_books as $test) { 
    $book_code = array_search($row['name'], $test); 
    if ($book_code !== FALSE) { 
     break; 
    } 
}
如果我對你的結構有更多的瞭解,這可能會減少到一個SQL語句和0循環。

+0

您鍵入快了很多,比我做的,並得到你的答案在第一位。 – labue 2010-12-15 16:48:49

+0

感謝這一點,我從來沒有用過任何東西,但默認中斷之前。但是,我忘了我沒有包括全部圖片! (對不起!)看到我上面的編輯。 – dijon 2010-12-15 16:50:45

+0

就是這樣,謝謝!我仍然有點困惑,爲什麼這個工作,而我沒有 - 我會再研究一下。但非常感謝你的幫助。 – dijon 2010-12-15 16:59:06

5
break; 

只會退出內部嵌套的foreach。如果$name_books中有更多行,它將繼續循環並最終用array_search的'false'值覆蓋$book_code;

一旦你找到你要找的值,可以使用:

break 2; 

關於你的編輯,在那裏你打破取決於你發現你正在與價值做什麼爲$book_code。如果您不打算繼續,請更改break的參數。 break 3;也將退出while循環。根據嵌套的級別更改值。

+0

我不知道break是否接受了一個參數;看起來我今天學到了一些新東西。 – Craige 2010-12-15 16:41:39

+0

這對我來說也是新聞。好帖子。 – Dutchie432 2010-12-15 16:44:19

+0

非常好,謝謝關於休息的信息。 – dijon 2010-12-15 17:04:39

1

simshaun是對的,但我會採取不同的方法。

我會檢查我的foreach循環中是否存在$ book_code,而不是處理中斷。

新代碼

foreach($name_books as $test) { 
    foreach ($test as $key => $value) { 
     if(!isset($book_code)){ 
      $book_code = array_search($row['name'],$test); 
      echo $book_code; //just to see if it works, which it does 
     } 
    } 
} 

echo $book_code." is the book code"; 
+1

我不同意。不打破兩個循環意味着它必須完成不必要的迭代。雖然實際上,除非陣列非常大,否則效率不會很明顯,突破循環效率更高。 – simshaun 2010-12-15 16:40:56

+0

我忽略了一些至關重要的信息!看到我上面的編輯。 – dijon 2010-12-15 16:51:46