簡體   English   中英

PHP數組指針瘋狂

[英]PHP array pointer craziness

我正在嘗試創建一個“ GetCurrentLevel”方法,該方法將一個點值作為輸入並返回對應的“ Level”。 我將Level => Points映射存儲在數組中,但是當我在foreach循環中使用它時,數組指針在邏輯上並沒有移動。 我添加了echo語句進行調試。 這是我的課程定義:

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分。

抱歉,很長的帖子。 謝謝你的幫助!

您應該閱讀foreach文檔頁面上的前兩個注釋:

注意:當foreach首次開始執行時,內部數組指針將自動重置為數組的第一個元素。 這意味着您不需要在foreach循環之前調用reset()。

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

我相信以數組作為引用將解決您的問題,但是記住另一個變量中的最后一個值而不是使用prev()可能更清潔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM