2012-06-15 2 views
2

Извините за фанки-титул, у меня возникли проблемы с появлением одного. Во-первых, мне удалось решить мою проблему (после разрыва моего кода), но я понятия не имею, ПОЧЕМУ мое решение работает, и я стараюсь рассматривать это как опыт обучения.Ошибка индекса PHP-массива

У меня есть класс, который собирает информацию с db. Этот класс отслеживает значение индекса, так что вызывающая функция может захватывать результаты по одному за раз. Так что мой код класса первоначально содержал ...

protected $index = NULL; 
protected $array = array(stuff); 

public function next_item() 
{ 
    if($this->index == NULL) 
    {//first time called 
     $this->index = 0; 
    } 
    else 
    { 
     $this->index++; 
    } 

    if($this->index < sizeof($this->array)) 
    { 
      return TRUE; 
    } 
     return FALSE; 
} 

public function get_result() 
{ 
     return $this->array[$this->index]; 
    } 

И вызываемая функция есть что-то похожее на

while($myclass->next_item()){ 
     echo $myclass->get_result(); 
} 

Это все намного сложнее, чем это, конечно, но это код задачи (и вы получаете идею). Этот код вызвал бесконечный цикл (или внешний вид одного) в моем проекте. Я исправил свою проблему, инициализируя $ index до -1 и удаляя условную проверку для null. Так что это сейчас ...

protected $index = -1; 

public function next_item() 
{ 
    $this->index++; 

    if($this->index < sizeof($this->array)) 
    { 
      return TRUE; 
    } 
    return FALSE; 
} 

Мой вопрос: ПОЧЕМУ это работало? Индекс никогда не упоминался в массиве, пока он был NULL, я проверил. Это всегда происходило после того, как была вызвана условная проверка для NULL и произошло присвоение 0.

Я действительно ценю ваше время, заранее. Просто пытаюсь превратить это в опыт обучения, и лучше, если я пойму, почему это сработало, а не только так.

Прошу прощения, если на этот вопрос ответит где-то в другом месте, я не мог понять, как обозначить мой вопрос (как вы можете видеть), тем более, что у него есть успешный поиск предыдущего ответа на него.

веселит, -Давид

+0

У вас может быть 'if (++ $ this-> index array))', чтобы сохранить строку, она увеличит ее для вас. – DanRedux

ответ

3

Ваша проблема была вызвана тем, что 0 == NULL в PHP. Поэтому, когда вы установите индекс на 0, как только вы будете постоянно устанавливать его на 0 снова и снова при каждом вызове next_item, this->index == NULL всегда будет правдой.

Изменение вашего теста на this->index === NULL также решило бы вашу проблему. См. this question, который охватывает разницу между == и === в PHP.

+0

Был избит до удара на этом. См. [Этот поток в NULL vs FALSE vs 0] (http://stackoverflow.com/questions/137487/null-vs-false-vs-0) – cpilko

+0

Большое спасибо, это было очень полезно. Я ценю ваше время. – dgeare

+0

@dgeare Нет проблем :) – Paulpro

Смежные вопросы