Форум сетевых администраторов Страницы (2): [1] 2 »
Показаны 29 сообщений на этой странице

Форум сетевых администраторов (http://netadmin.ws/forum/index.php)
- PHP (http://netadmin.ws/forum/forumdisplay.php?forumid=6)
-- Пагинация - или деление по приблизительному количеству символов (http://netadmin.ws/forum/showthread.php?threadid=5175)


Помещено Tagore 19-04-2003 в 10:40:

Red face Пагинация - или деление по приблизительному количеству символов

Пример на асп: здесь

Ð_то самое надо решить на уровне пхп. Надо, что бы текст из БД или файло брали бы по кускам 250 слов (если такое возможно) или 1500 знаков. Но тогда возникает проблема - надо отставить неразорванные преддожения, как это сделать, хотя бы читсо на уровне теории, если скрипт работает по принципу количества символов?

__________________
Международное брачное агенство в Сибири.


Помещено Stdin 19-04-2003 в 11:37:

Может для начала использовать в качестве разделителя точку, т.е. чтобы в каждом элементе массива были целиковые предложения, ну и потом отсматривать каждое, т.е. если текущее и соседние предложения в сумме меньше 1500 символов, то группировать их вместе....


Помещено Tagore 19-04-2003 в 15:03:

А функции какие можешь посоветовать, как с трудом себе это представляю. Если поможешь, помогу и я. Я то дизайнер, куча добра всякого, это все, что я могу. Са-то это написать не смогу, надо будет другому обяснить, что и примерно как должно быть. Согласен?

__________________
Международное брачное агенство в Сибири.


Помещено Stdin 19-04-2003 в 15:15:

Функции все стандартные,
split() - для разделения
strlen() - для подсчета количества символов в строке.


Помещено Tagore 19-04-2003 в 15:56:

$strVar{$offset}

substr()

while(){
}

???

__________________
Международное брачное агенство в Сибири.


Помещено Rumata 19-04-2003 в 19:31:

Хмм. Ð_то ведь пхп, имхо $strVar{$offset} выглядит немного странно ..

Хорошо. Допустим у тебя в $str лежит весь текст целиком. Нужно выдрать первый 1500 знаков с учетом предложений (если то же нужно сделать не получая весь текст в переменную - это немного другой разговор).

Посмотри на код - он делает то, что тебе надо только для 50 символов, а не 1500. Думаю преобразовать его не проблема =))

PHP:


$str 
= "bla bla nla. asdfasd. fdsfd fafsasf. asasdwe fdscz asdvc. afasffas. afafs vcxrqw cvea.";
$arr = explode('.',$str);
$c = count($arr);
$k = 0;
$str = "";
for (
$i=0;$i<$c;$i++){
  if (
$k < 50)
    
$str .= $arr[$i].".";
  
$k += strlen($arr[$i]);
}
print 
$str;


Помещено Tagore 20-04-2003 в 09:09:

Попробую.
Мне надо тип чтобы я в text area загрузил текст, а он сам его забил бы по этим страницам. Ð_то что-то уже другое? То-есть можно и не хранить в переменную, мне главное, что бы это работало быстро.

__________________
Международное брачное агенство в Сибири.


Помещено Rumata 20-04-2003 в 11:14:

quote:
Первоначальное сообщение от Tagore
Попробую.
Мне надо тип чтобы я в text area загрузил текст, а он сам его забил бы по этим страницам. Ð_то что-то уже другое? То-есть можно и не хранить в переменную, мне главное, что бы это работало быстро.

погоди, что-то я не очень понял чего же ты зочешь. Твой пример у меня не открывается, так что объясни четко словами, что и с чем должен делать скрипт. Желательно еще и для чего.

Тот код, что я тебе написал, берет первые 1500 символов из текста и выводит их с учетом предложений. Такое например можно использовать для предпросмотра неких текстов. А что нужно тебе?


Помещено polo 20-04-2003 в 13:50:

Скорее всего ему нужно это использовать для статей. Чтобы скрипт автоматом создавал разные страницы. Думаю твой пример подходит для этого немного его переделав например засунув в функцию и передавть туда текст и оффсет например номер страницы и функия бы возвращяла нужный отрывок.
1. Ð_азбиваем текст на массив, каждый элемент которого будет содержать отрывок текста.
2. Возвращяем $massiv[$offset].

__________________
Всегда есть решение.


Помещено Rumata 20-04-2003 в 14:14:

Тогда получается что-то в этом роде (через $str возвращается массив "страниц"):
PHP:


$str 
= "bla bla nla. asdfasd. fdsfd fafsasf. asasdwe fdscz asdvc. afasffas. afafs vcxrqw cvea."; 
$arr = explode('.',$str); 
$c = count($arr); 
$k = 0; 
$j = 0; 
$str = array(""); 
for (
$i=0;$i<$c;$i++) {
  if (
$k > 20) {
    
$k = 0; 
    
$j++; 
    
$str[$j] = "";
  } 
  
$str[$j] .= $arr[$i]."."; 
  
$k += strlen($arr[$i]); 
} 
$str[$j] = substr($str[$j],0,-1);
print_r($str);


Помещено peteK 21-04-2003 в 08:46:

как вам такая функция, возврашающая страницы текста $TEXT, в котором минимум $chars_per_page.

PHP:


function DivideToPages($TEXT,$chars_per_page = 1500) {
    
$pages = array();
  
$page_no = 0;
    while (
$TEXT!='') {
     
$pages[$page_no] = substr($TEXT,0,$chars_per_page);
     
$TEXT = substr($TEXT,$chars_per_page);
     while ((
$pages[$page_no][strlen($pages[$page_no])-1]!='.')&&($TEXT!='')) {
         
$pages[$page_no] .= $TEXT[0];
         
$TEXT = substr($TEXT,1);
     }
     
$page_no++;
    }
    return 
$pages;    
}



peteK добавил 21-04-2003 в 08:59:55:
попытка соптимизировать. цикл while до точки убрал - если длинные предложения в тексте будут - будет не оч. хорошо работать предыдущий вариант. Хотя конечно не факт что функция pos намного быстрее будет работать. Кто что думает?


PHP:

function DivideToPages($TEXT,$chars_per_page = 1500) {
    
$pages = array();
  
$page_no = 0;
    while (
$TEXT!='') {
     
$pages[$page_no] = substr($TEXT,0,$chars_per_page);
     
$TEXT = substr($TEXT,$chars_per_page);
     if (
$TEXT!='') {
         
$pos = strpos($TEXT,'.');
         if (!(
$pos === false)) {
          
$pages[$page_no] .= substr($TEXT,0,$pos+1);
          
$TEXT = substr($TEXT,$pos+1);
         }
     }
     
$page_no++;
    }
    return 
$pages;    
}

__________________
www.relmax.com
Web Site Design and Development


Помещено Rumata 21-04-2003 в 14:27:

Насчет длинных предложений - можно использовать strrpos и сокращать объем текста, а не увеличивать его. Имхо pos лучше, чем while.


Помещено polo 21-04-2003 в 19:21:

единственное замечание по всему этомоу, имхо нужно использовать для поиска точку и пробел, именно так заканчивается предложение а не просто точку, так как под раздачу может попасть строка содержащяя script.php или domain.com.

polo добавил 21-04-2003 в 19:22:22:
Даже было бы логичнее использовать проверку как точка пробел и заглавная буква, тогда ошибки правктически исключены.

__________________
Всегда есть решение.


Помещено peteK 21-04-2003 в 20:02:

да точка+пробел это правильнее. У меня как раз урл'ы резались на стыке страниц.

но не совсем правильно как я убедился на своих задачах. Ð_то проверка не пропускает конец абзаца! Т.е. если предложение последнее в абзаце, ф-я будет прибавлять к тексту первое предложение следующей страницы.

а вообще как раз логичнее (это конечно мое мнение - и относится оно большей частью к моему текущему проекту) разбивать текст на страницы по абзацам, т.е. 1500 символов + текст до конца абзаца.

но вот не могу пока придумать как это сделать.

strpos($TEXT,".\n") - не работает..

__________________
www.relmax.com
Web Site Design and Development


Помещено Tagore 22-04-2003 в 08:59:

Exclamation пхпклуб.нет

polo
RomikChef говорит что:
echo substr($str,$_GET['pos'],strpos($str,".",$_GET['pos']+1500));

Ð_то как?

__________________
Международное брачное агенство в Сибири.


Формат времени GMT. Текущее время 11:51. Страницы (2): [1] 2 »
Показаны 29 сообщений на этой странице

Powered by: vBulletin Version 2.2.4
Copyright © Jelsoft Enterprises Limited 2000, 2001.