public function find($cond = array(), $select = '', $return_dyadic_array = FALSE) { //{{{ $this->_CI->load->model('User', 'user_m', TRUE); $this->_CI->load->model('Scheme', 'scheme_m', TRUE); $retweets = parent::find($cond, $select, TRUE); if (empty($retweets)) { return array(); } //获取的 $retweets 就是按 retweet_id 的升序排列 //只需要在遍历时 查询余下部分是否有包含相同 scheme_id 的 //数据并清除之便可 //@todo 为了节约时间 可以利用的优势就是 返回的集合不需要是有序的 ( 因为之后还会再按照时间排序 ) foreach ($retweets as $i => $retweet) { //@todo 一切都是为了所谓的合并转发 此算法有改进的余地 起码不必每次都计算 sizeof if (sizeof($retweets) > 1) { //标志是否已经删除了某条记录 $has_unset = FALSE; //取余下的数组 array_walk(array_slice($retweets, $i), function ($value, $key) use(&$retweets, $retweet, $i, &$has_unset) { if ($retweet['scheme_id'] === $value['scheme_id']) { //有重复 删除当前的( 下标为$i ) 的记录 unset($retweets[$i]); $has_unset = TRUE; } }); if ($has_unset === TRUE) { continue; } } $prev_retweet_id = $retweet['prev_retweet_id']; if (is_numeric($prev_retweet_id) && $prev_retweet_id > 0) { //有效的 prev_retweet_id 意味着是 二转 或以上 //此处如果调用本函数的话 会形成一个递归 获取完整的转发链 //但是目前(只使用二转的情况)是没有必要的 $prev_retweet = parent::find(array('retweet_id' => $prev_retweet_id)); //此处的断言是 prev_retweet 信息是一定存咋的 若不存在 则需要触发一个异常 if (empty($prev_retweet)) { throw new Exception('通过有效的 prev_retweet_id 获取了一个空的 retweet.[prev_retweet_id=' . $prev_retweet_id . ']'); } //获取相关用户信息 $prev_retweet_user = $this->_CI->user_m->find(array('user_id' => $prev_retweet['retweeter_id'])); } else { //无效的 prev_retweet_id 意味着是一转 //"转发自"用户信息就是方案的所有用户 $scheme = $this->_CI->scheme_m->find(array('scheme_id' => $retweet['scheme_id'])); $prev_retweet_user = $scheme['holder']; } //获取当前 retweeter 用户的信息 $retweets[$i]['retweeter'] = $this->_CI->user_m->find(array('user_id' => $retweet['retweeter_id'])); $retweets[$i]['prev_retweet_user'] = $prev_retweet_user; $retweets[$i]['formated_time'] = $this->format_time($retweet['time']); } if ($return_dyadic_array == FALSE && sizeof($retweets) == 1) { return array_shift($retweets); } return $retweets; }
public function get_user_id_by_nick($user_nick = '') { //{{{ $user_id = NULL; if (!empty($user_nick)) { $user_info = parent::find(array('nick' => $user_nick)); if (empty($user_info)) { throw new Exception("查找的用户 nick 不存在,但是其方案信息却存在于用户页面上. user_nick=[{$user_nick}]"); } if (sizeof($user_info) > 1) { throw new Exception("查找的用户 nick 在数据库中存在多条记录. user_nick=[{$user_nick}]"); } $user_id = $user_info['user_id']; } return $user_id; }
public function get_expire_time($scheme_id) { //{{{ $this->_CI->config->load('scheme'); $expire_time = $this->_CI->config->item('expire_time'); $scheme = parent::find(array('scheme_id' => $scheme_id)); if (empty($scheme)) { return -1; } //获取方案 发布/转发 时间 $time = strtotime($scheme['time']); return date('Y-m-d h:i:s', $time + $expire_time); }