Получание списка случайных топиков

Потребовалось вот получить список каких-нибудь случайных новостей. С удивлением не нашел ничего похожего готового, только вот тут какое-то недообсуждение. Так, что пришлось делать своими руками.

		// Задаем фильтр топиков
		$aFilter=array(
			'topic_publish' => 1,
		//			'blog_id' => $oBlog->getId(),
		);

		// получаем количество топиков по заданному фильтру
		$cnt=$this->Topic_GetCountTopicsByFilter($aFilter);

		$out=array();
		if ($cnt>0)
		{
			// устанавливам нужное нам число топиков
			$needed=3;
			if ($needed>$cnt)
			{
				$needed=$cnt;
			}

			$selected=0;
			do
			{
				// получаем случайный топик
				if ($aResult=$this->Topic_GetTopicsByFilter($aFilter,rand(1,$cnt),1))
				{
					// убеждаемся, что мы его еще не включили в свой список
					$oTopic=array_pop($aResult['collection']);
					$tid=$oTopic->getId();
					if (!isset($out[$tid]))
					{
						// включаем в список
						$out[$tid]=$oTopic;
						$selected++;
					}
				}
			} while ($selected<$needed);
		}
		// Ну и, например, засовываем список в темплейт
		$this->Viewer_Assign('aTopics',$out);


Все сделано средствами самого livestreet'а без всяких хаков и прямого mysql. Да и, по идее, с выборкой из большого количества топиков должно справляться нормально. Единственное не уверен, как модуль базы данных реализует постраничность. Надеюсь быстро :)

3 комментария

avatar
Не подскажите по поводу моего вопроса. Тема вроде схожа. livestreet.ru/blog/6466.html
avatar
Ну у вас там не совсем все так. Есть «ряд нюансов» типа как раз исключить дублирующиеся топики, при чем, наверное, не затрагивая количество выводимых сообщений. Судя по вашему уровню подготовки — объяснить будет тяжело, а делать за вас времени нет… :( Но копать надо примерно так — СНАЧАЛА получить топики из блока 2 и блока 3, затем получать один за другим общие топики для блока 1 и проверять нет ли их в блоках 2 и 3, увеличивая счетчик только при добавлении
avatar
А как этим воспользоваться? я почему-то грешным делом подумал что это код для blockName.class.php
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.