2012-01-16 73 views
0

Yii框架中有「Undefined offset」錯誤,如果下一個id爲null,並且如果上一個id爲前一個id爲null,那麼我需要先轉到第一個id?Yii上未定義的偏移量錯誤

public static function getNextOrPrevId($currentId, $nextOrPrev) 
{ 
    $records=NULL; 
    if($nextOrPrev == "prev") 
     $order="id DESC"; 
    if($nextOrPrev == "next") 
     $order="id ASC"; 

    $records=Photo::model()->findAll(
     array('select'=>'id', 'order'=>$order) 
     ); 

    foreach($records as $i=>$r) 
     if($r->id == $currentId) 
      return $records[$i+1]->id ? $records[$i+1]->id : NULL; 
    return NULL; 
} 

錯誤行

return $records[$i+1]->id ? $records[$i+1]->id : NULL; 
+0

你是什麼意思「如果最後一個ID如果以前的ID爲空?」 ? – 2012-01-16 20:56:44

回答

1
return isset($records[$i+1]) ? $records[$i+1]->id : NULL; 

不過說真的,你應該直接select the next id from the database,而不是通過他們選擇的所有ID和循環一一PHP。

$record = Photo::model()->findAll(array(
    'select' => 'id', 
    'order' => $order, 
    'where' => "id > $currentId", 
    'limit' => 1 
)); 

(我不知道Yii的,所以我只是做語法了。你的想法雖然。)

-2

請記住,PHP陣列基於零...當你到達最後一項,你試圖從$ records [$ i + 1] - > id中檢索一個值,其中$ i可能是最後一項的索引,但是'加一'不存在!

儘量避免使用的foreach和使用FOR的簡單形式..

// Not like this 
foreach($records as $i=>$r) 
    if($r->id == $currentId) 
     return $records[$i+1]->id ? $records[$i+1]->id : NULL; 

// I recommend 
for($i=0; $i<sizeof($records); $i++){ 
    if(isset($records[$i]) && $records[$i]->id == $currentId) 
     return $records[$i]->id; 
} 

笑,對不起我的英文不好,但我希望我解釋。

來自Mx的問候。

+1

-1 - 「儘量避免使用任何方法」...您有權威的參考文獻來支持這個建議嗎? 'foreach'是更乾淨的語法(只要看看你自己的例子),特別是在關聯數組中的鍵不連續的情況下(這會破壞你的方法)。這不是使用'foreach'來打破這個代碼,而是使用'$ i + 1'。這會在經典'for'循環的最後一個循環中導致錯誤。 – Sepster 2012-09-26 16:24:21