PHP数组指针疯狂

时间:2010-05-29 04:58:53

标签: php

我正在尝试创建一个“GetCurrentLevel”方法,该方法将点值作为输入并返回对应的“Level”。我正在存储Level =>数组中的点映射,但当我使用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分。

对不起,很长的帖子。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

您应该阅读foreach documentation page上的前两个注释:

  

注意:当foreach首次开始执行时,内部数组指针会自动重置为数组的第一个元素。这意味着您不需要在foreach循环之前调用reset()。

     

注意:除非引用了数组,否则foreach将对指定数组的副本进行操作,而不是对数组本身进行操作。 foreach对数组指针有一些副作用。在foreach期间或之后不要依赖数组指针而不重置它。

使数组成为引用我相信会解决您的问题,但是记住另一个变量中的最后一个值而不是使用prev()

可能更清晰