2012-01-16 6 views
0

Yiiフレームワークで「未定義オフセット」エラーがあります。次の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がnullの場合は最後のIDですか」とはどういう意味ですか? ? –

答えて

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

しかし、実際には、あなたが直接select the next id from the database、それらを介してPHPで一つずつすべてのIDとループを選択しないでください。

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

(私はYiiのを知らないので、私はちょうど構文アップを作ってるんだ。あなたはかかわらず、アイデアを得る。)

-2

あなたが到達したときに... PHPの配列がゼロをベースとしていることを忘れないでください$ records [$ i + 1] - > idから値を取得しようとしています。ここで$ iは最後の項目のインデックスですが、 'plus one'は存在しません!

は私の悪い英語のため申し訳ありません、笑

// 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; 
} 

... foreachの使用を避けるとFORの簡単なフォームを使用しようが、私は、私が説明したいと考えています。

Greetings from Mx。

+1

-1 - "foreachを避けるようにしてください" ...この提案を元に戻す権威のあるリファレンスがありますか? 'foreach'は、よりクリーンな構文です(独自の例を見てください)。特に、連想配列のキーが連続していない場合(あなたのアプローチを壊すことになります)。このコードを破ったforeachの使用ではなく、 '$ i + 1'の使用でした。これにより、古典的な 'for'ループの最終ループにもエラーが発生していました。 – Sepster