2010-05-29 100 views
1

我試圖創建一個「GetCurrentLevel」方法,它將一個點值作爲輸入並返回對應的「級別」。我將Level => Points映射存儲在一個數組中,但是當我使用它作爲一個foreach循環時,數組指針不會在邏輯上移動。我添加了用於調試的回顯語句。這裏是我的類定義:PHP數組指針瘋狂

class Levels extends Model 
{ 
    protected $_map = array (
          'None' => 0, 
          'Bronze' => 50, 
          'Silver' => 200, 
          'Gold' => 500 
          ); 

    public function __construct() 
    { 
     parent::__construct(); 
    } 


    public function GetCurrentLevel($points) 
    { 
     foreach ($this->_map as $name => $threshold) 
     { 
      echo "Level Name: $name<br/>"; 
      echo "Level Threshold: $threshold<br/>"; 
      echo "Current Level: " . key($this->_map) . "<br/>"; 
      echo "Current Threshold: " . current($this->_map) . "<br/>"; 

      if ($points < $threshold)  /* Threshold is now above the points, so need to go back one level */ 
      { 
       $previousThreshold = prev($this->_map); 
       echo "Previous Threshold: $previousThreshold<br/>"; 
       echo "Final Level: " . key($this->_map) . "<br/>"; 
       return key($this->_map); 
      } 

      echo "Go to next level <br/>"; 

     } 
    } 
} 

這裏是我所看到的,當我打電話GetCurrentLevel(60)

級別名稱:無
級別閾值:0
當前等級:青銅//貌似的foreach立即移動陣列指針
當前閾值:50
轉到下一級
級別名稱:青銅色
等級閾值:50
當前等級:青銅// WTF?爲什麼數組指針沒有移動?
電流閾值:50
進入一個新的水平
級別名稱:銀
級別閾值:200
當前等級:青銅// * WTF?爲什麼數組指針沒有移動? * //
電流閾值:50
上閾值:0
最後一級:無

但「最終級別」應該是「青銅」,因爲60點是需要一個青銅的50點以上獎牌,但低於銀牌所需的200分。

對不起,很長的文章。謝謝你的幫助!

回答

1

應該讀取的第一兩個音符上foreach documentation page

注意:當foreach開始執行時,內部數組指針自動復位到所述陣列的第一個元素。這意味着你不需要在foreach循環之前調用reset()。

注意:除非數組被引用,否則foreach對指定數組的副本而不是數組本身進行操作。 foreach對數組指針有一些副作用。不要在foreach期間或之後依賴數組指針而不重置它。

使得數組的引用會相信解決您的問題,但它可能是清潔劑只記得最後一個值在另一個變量,而不是使用prev()

+0

感謝。我只記得最後一個價值,它是一個更清潔(和工作!)。 – JMan 2010-05-29 05:25:15

+0

請注意,手冊的引用部分最近已被重寫。 – Gordon 2011-11-24 23:30:14