в php сделать ссылки на похожие материалы

S
На сайте с 30.09.2009
Offline
116
1077

Ребят, извините, если часто вопросы задаю, но нужна подсказка в идее.

Есть папка с информационными материалами - статьи по теме сайта. Сайт на php.

Хочется сделать в конце каждой статьи менюшку - "другие материалы". Тайтл самого того материала (как анкор) и ссылку на него. На 2 (или 3) следующие статьи. Желательно конечно не хаотично,а

в статье 1 - ссылки на 2 и 3,

в статье 2 - ссылки на 3,4

в статье 3 - ссылки на 4,1 (на 1 при условии что нету статьи 5).

в статье 4 - ссылки на 1,2.

Вот не знаю с чего начать, как реализовать.

Если кто подскажет, большое спасибо.

Перелинковку сделал. Теперь думаю куда потратить денежки - сапа, мира или блоги :)
firefox19
На сайте с 05.11.2009
Offline
34
#1

еще раз скажу, с БД mySQL ;) Не так страшен черт...

Может лучше было бы Вашу старую тему поднять?

Ваши идеи - наша работа (http://yaweb.ru) Продам Сайт агентства недвижимости (/ru/forum/561489)
pikasso
На сайте с 27.01.2008
Offline
150
#2

А в чем собственно то проблема ? Это элементарный запрос в бд с последующим выводом результатов.

firefox19
На сайте с 05.11.2009
Offline
34
#3

pikasso, проблема в том что у ТС сайт на файлах

O
На сайте с 06.08.2010
Offline
2
#4

А как сами статьи-то именуются в каталоге? Или есть какой-то массив?

Ну и на кой мне эта подпись?..
S
На сайте с 30.09.2009
Offline
116
#5
Opupenko:
А как сами статьи-то именуются в каталоге? Или есть какой-то массив?

Сейчас как раз этим занимаюсь.

Статьи в папке будут именоваться так:

1-krasnaj-glina.php

2-kafel-dla-kuhni.php

и т.д.

Сейчас сделал следующее.

Открыл директорию с файлами, просканировал, записал в массив, отсортировал массив, записал в отсортированном порядке в файл text.txt

Теперь мучаюсь как вывести

Вывод хочу сделать что-то вроде


for ($q=$s; $q<=2; $q++) {
echo '<li>'.$files[$q].'</li>'; }

здесь $s - это будет первый символ +1, в названии файла текущей страницы.

bomber
На сайте с 13.07.2007
Offline
108
#6

Уважаемый ну вы наверно вкурсе что будут возникать проблемы со сканом директории где файлов более 1000 (применительно к никсам).

Теперь по теме, если у вас есть уникальный нумератор файтов его и используйте, выводите следующий за ним эл-т, и первый, если после него нет элементов. Ну если по школьному то:

if (isset($arr[$my_key+1])) echo $arr[$my_key+1]['title']; else echo $arr[0]['title'];

if (isset($arr[$my_key+2])) echo $arr[$my_key+2]['title']; else echo $arr[1]['title'];

где $my_key: id текущей статьи.

Рекурсия - см. рекурсия.
S
На сайте с 30.09.2009
Offline
116
#7
bomber:
Уважаемый ну вы наверно вкурсе что будут возникать проблемы со сканом директории где файлов более 1000 (применительно к никсам).

Нет, не в курсе, спасибо. Но думаю в этой папке не будет более 1000 файлов )

stroydomen добавил 27.08.2010 в 12:52

bomber:

if (isset($arr[$my_key+1])) echo $arr[$my_key+1]['title']; else echo $arr[0]['title'];
if (isset($arr[$my_key+2])) echo $arr[$my_key+2]['title']; else echo $arr[1]['title'];
где $my_key: id текущей статьи.

Извините, но даже так - мне не сразу понятно. Не понятно куда этот код вставлять и от куда массив с данными $arr и что такое 'title' в данном случае у вас?

Я остановился на том, что я записал данные в файл.

Теперь открываю файл

  

// ОТКРЫВАЕМ ФАЙЛ ДЛЯ ЧТЕНИЯ
$ff=fopen("text.cache", "r");
fclose($ff);
// и хочу сделать типа такого
for ($q=0; $q<=2; $q++) {
echo '<li>'.$files[$q].'</li>'; }

но я пока не понял, как из файла это дело загнать в массив. Или я не туда копаю?

stroydomen добавил 27.08.2010 в 12:57

В принципе в Вашем предложении почти разобрался. Пока не могу справиться с тем, чтобы данные из файла загнать в массив arr...

O
На сайте с 06.08.2010
Offline
2
#8


/**
* Выборка статьи и ссылок на след.статьи, при условии правильного именования
* 1-bla-bla.php
* 2-jopa.php
* 3-hrenoten.php
* 15-f.php
* 26-d.php
* ...
* или что-то подобное
* @param string $dir
* @param string $article
* @param array $cache
*/
function loadArticle($dir, $article, $cache = array()) {
if (!is_readable($dir)) { // проверяем каталог на доступность чтения
throw new Exception('А подайте мне материалов на блюдечке!');
}

$dir = str_replace('//', '/', $dir . '/'); // я извращенец =))

if (!is_readable($path = $dir . $article)) { // ищем статью
throw new Exception('А где статья-то, козяина???');
}

$result = array(
'include' => $path, // я хз, как там будет дальше статья отображаться, верну просто адрес для инклюда
'links' => array()
);

if (!count($cache)) { // в кеше пусто - перечитываем, потом куда-нить засунуть надо (файл, сессия, база)
if (($dh = opendir($dir))) {
while (($file = readdir($dh)) !== false) {
if ($file === '.' || $file === '..' || !preg_match('/^(\d+)\-.+\.php$/', $file, $matches)) { // пропускем корявости и спец.каталоги
continue;
}

if (($num = (int)$matches[1])) { // пихаем в кеш
$cache[$num] = $dir . $file;
}
}
closedir($dh);
}
ksort($cache, SORT_NUMERIC);
}

$_SESSION['cache'] = $cache; // я суну в сессию для примера, мне нужно будет испоганить кеш чуть ниже

preg_match('/^(\d+)\-.+\.php$/', $article, $matches); // выделяем номер текущей статьи
if (($num = (int)$matches[1])) {
// после этого останется массив с нужной сортировкой сверху наша
$tmp = array_keys($cache);
$cache = array_merge($tmp = array_slice($cache, array_search($num, $tmp)), array_slice($cache, 0, count($cache) - count($tmp)));
array_shift($cache); // убираем ее

if (count($cache)) {
$result['links'][] = array_shift($cache);
}

if (count($cache)) {
$result['links'][] = array_shift($cache);
}
}

return $result;
}

// использование
echo '<pre>';
print_r(loadArticle(dirname(__FILE__) . '/dir/', '26-d.php'));
pikasso
На сайте с 27.01.2008
Offline
150
#9
firefox19:
pikasso, проблема в том что у ТС сайт на файлах

Не обратил внимания, приношу свои извинения.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий