2010-12-28 12 views
0

私はフォーラムを作成しています。ユーザーが最後に訪問した後に更新されたスレッドを追跡したいと思います。だから私は基本的に[$boardid][$threadid] = 1として構造化されている$ _SESSIONで保持する配列を持っています。 threadidとboardidが設定されている場合、スレッドは読み取られておらず、ボードには未読スレッドが含まれています。ユーザーがスレッドを見るとき、私はちょうどunset()適切なボードとスレッドIDです。しかし、私はこのような配列で動作するように設定を解除することに問題があります。オーバーロードされたプロパティの間接的変更

はまず、私はその後、私は現在のユーザーを表すCurrentUserにクラスを持って少しよりよい

class Session { 
private $_namespace; 

public function __construct($namespace = '_default') { 
    $this->_namespace = $namespace; 
} 

/** 
* Erase all variables in the namespace 
*/ 
public function clear() { 
    unset($_SESSION[$this->_namespace]); 
} 

public function __set($name, $value) { 
    $_SESSION[$this->_namespace][$name] = $value; 
} 

public function __get($name) { 
    if(isset($_SESSION[$this->_namespace]) && array_key_exists($name, $_SESSION[$this->_namespace])) { 
     return $_SESSION[$this->_namespace][$name]; 
    } 

    return null; 
} 

public function __isset($name) { 
    return isset($_SESSION[$this->_namespace][$name]); 
} 


public function __unset($name) { 
    unset($_SESSION[$this->_namespace][$name]); 
} 

}; 

をセッションデータを処理するためにセッションクラスを持っています。 CurrentUserクラスにはSessionオブジェクトである_dataという名前のメンバがあります。 CurrentUserクラスでは、_dataメンバーを使用するために、__getメソッドと__setメソッドをオーバーライドします。

public function __set($name, $value) { 
    $this->_data->$name = $value; 
} 

public function __isset($name) { 
    return isset($this->_data->$name); 
} 

public function __get($name) { 
    if(isset($this->_data->$name)) { 
     return $this->_data->$name; 
    } 

    return null; 
} 

ここで、未読のスレッドを追跡するために、日付がユーザーのlast_seenの日付を超えるすべてのスレッドを取得します。配列からボードとスレッドを削除する方法もあります。

public function buildUnreadList($since) { 
    // Build a "new since last visit" list 
    $forumModel = new Model_Forum(); 
    $newThreads = $forumModel->fetchThreadsSinceDate($since); 
    foreach($newThreads as $thread) { 
     $tmp =& $this->unreadThreadsList; 
     $tmp[$thread['board']][$thread['id']] = 1;    
    } 
} 
public function removeThreadFromUnreadList($boardid, $threadid) { 
    $threads =& $this->unreadThreadsList; 
    unset($threads[$boardid][$threadid]); 
} 

public function removeBoardFromUnreadList($boardid) { 
    $threads =& $this->_data->unreadThreadsList; 
    unset($threads[$boardid]); 
} 

これは私が問題に遭遇しているところです。 にエラーが発生しました$threads =& $this->_data->unreadThreadsList;この問題を解決する方法と、より良いソリューションを設計する方法はありますか?私は、配列の配列を配列する必要はないので、配列を追跡するクラスを作成することを考えましたが、オブジェクトを永続化したり、配列を管理するためにオブジェクトを作成することは確実ではありません。私に。

答えて

0

申し訳ありませんが、私は少し離れてベースです。変数の使用方法(初期化が表示されていないため)を理解しようとしています。したがって、$ this-> unreadThreadsListは、インデックスがある場合の配列です(値が1に設定されている場合)。なぜすべてを直接設定しないのですか?

あなたがしていることを見ると、ここに私が持っていたアイデアがあります。これは同じことをしますが、$ this-> unreadThreadsListをチェックするだけで、変数に直接アクセスします。

私は適切に配列構造を把握していると仮定すると、これはうまくいくはずです。 "fetchThreadsSinceData(以降$)" の結果との$ this - >ため

array(
    1 => array(
     2 => 1 
    ), 
    2=> array(
     2 => 1 
    ), 
    3=> array(
     2 => 1 
    )); 

のアレイ構造に

array(
    1 => array(
     'board' => 1, 
     'id' => 2 
    ), 
    2 => array(
     'board' => 3, 
     'id' => 1 
    ), 
    3 => array(
     'board' => 7, 
     'id' => 2 
    )); 

:このような配列構造をとる

public function buildUnreadList($since) { 
    // Build a "new since last visit" list 
    $forumModel = new Model_Forum; 
    $newThreads = $forumModel->fetchThreadsSinceDate($since); 
    foreach($newThread as $thread) 
    { 
     // Avoid an error if no list pre-exists 
     if(is_array($this->unreadThreadsList)) 
      if(array_key_exists($thread['board'],$this->unreadThreadsList)) 
       if(array_key_exists($thread['id'],$this->unreadThreadsList[$thread['board']])) 
        // Skip this result, already in 
        if($this->unreadThreadsList[$thread['board']][$thread['id']] == 1) continue; 
     $this->unreadThreadsList[$thread['board']][$thread['id']] = 1; 
    } 
} 

unreadThreadsListここで、最初のインデックスはボードであり、2番目のインデックスはスレッドIDです。

他の機能については、単にそれらを直接設定しないのはなぜですか?

unset($this->unreadThreadsList[$boardid][$threadid]); 
unset($this->unreadThreadsList[$boardid]); 

幸運!
デニスM.

関連する問題