Математика: постраничный вывод

jeka!

Просто Member
Математика: постраничный вывод

Простите за ламерский вопрос, я тут голову себе всю изломал как решить такую задачу:
PHP:
$x = 50; # Всего страниц
$y = 10; # По сколько выводить
$t =   4; # Текущая страница
Нужно вычислить начало и конец вывода.
$start = ?; # Я знаю, что тут должно быть 1
$end = ?; # а тут 10, если текущая 4

Я по дуратски решил это так:
PHP:
if (($t%$y) != 0) {
$d = preg_replace("/^([0-9]*)([0-9]{1})$/","\\1",$t);
$d = $d*10;
}
$start = $d+1;
$end = $start+$y-1;

print $start." : ".$end;
Так то оно конечно работает, но я применил строковое выражение, когда это можно сделать математически, просто не знаю как математикой выразить это, помогите, а то по козьи как то получается...
 

Yuriy_S

-=PHP-Club=-
причем тут регулярное выражение....
Ты ссылками передавай, а вообще в поиск!
Я писал тему эту уже, и там есть готовый код!
 

RomikChef

Guest
Клоун.

C какого бодуна ты решил, что на ЧЕТВЕРТОЙ странице начало должно быть 1, а конец - 10?
 

jeka!

Просто Member
Клоун.

C какого бодуна ты решил, что на ЧЕТВЕРТОЙ странице начало должно быть 1, а конец - 10?

Хе, а как по твоему делается вывод?

1 2 3 4 5 6 7 8 9 10
текушая 4.
нажимаешь на 10, новый список уже:
9 10 11 12 13 14 15 16 17 18 19
и т.д.

Клоуны те, кто этого не понимают, и делают неудобный переход.

Вот моя функция которая всё делает правильно, просто рега меня убивает, потому что математикой выразить не смог, советчики блин!

PHP:
function page($count,$max_res_page=10,$page=1) {
	if (($page%$max_res_page) != 0) {
		$end_str = preg_replace("/^([0-9]*)([0-9]{1})$/","\\1",$page)*10;
	} else $end_str = $page-1;
	$str = $end_str;
	$end = $str+$max_res_page;
	if ($str<=1) $str = 1;
	if ($end>=$count) $end = $count;
	for ($i=$str; $i <= $end; $i++) {
		if ($i == $page) echo " <strong>$i</strong> ";
		else echo " <a href=\"?page=".$i."\">$i</a> ";
	}
}
$count = всего страниц,
$page = текущая
 

jeka!

Просто Member
Вот этот пример я бы как раз и адресовал в Юмор!

Мне не надо вычислять сколько текстов надо выводить на странице, мне надо ограничивать сам вывод списка страниц.

Пример Ромика шэфа, подходит лишь для гостевой книжечки, для маленького сайтика, куда никто не ходит!

Представь у тебя в базе 70000 анекдотов, и ты выводишь по 10 на страницу, какой у тебя будет список страниц? 7000 записей!!!

И ты их все вывалишь пользователю на экран? :)))))))))))))

Требую эту тему из юмора убрать, ей тут не место.
 

leosha

Старожил PHPCLub
Не, с каждым своим постом ты все больше и больше сажаешь себя в лужу.
То, что ты не можешь в элементарный пример добавить элементарную же, нужную тебе фичу говорит нам о чем?
 

RomikChef

Guest
Этот чудик мало того, что не может сообразить отнять от текущей страницы 5 и прибавить 5, проверить границы диапазона и вывести, так еще и объяснить толком не может, что ему надо.
 

jeka!

Просто Member
В общем, если не можете дать пример как заменить регу на другое выражение, тогда молчали бы лучше, у меня и так всё прекрасно работает в этом варианте, и код получился компактный. Так что все остались при всоём...
 

kvn

programmer
:))
вот это я посмеялся.

А если по теме, то я для себя юзаю PEAR::pager_Sliding.
как раз то, что тебе нужно.

http://pear.php.net/package-info.php?pacid=136
http://cvs.php.net/cvs.php/pear/Pager_Sliding

оччень удобно..

А если в общем, то горе тот программист, который береться программить не зная алгоритмов.
Учите матчасть уважаемый jeka!
 

Raziel[SD]

untitled00
вообще-то можно так :)
$y = 10; # По сколько выводить
$t = 4; # Текущая страница

start := (t div y)*y;
end := start + y;
 

jeka!

Просто Member
вот это я посмеялся.

А если по теме, то я для себя юзаю PEAR::pager_Sliding.
как раз то, что тебе нужно.

http://pear.php.net/package-info.php?pacid=136
http://cvs.php.net/cvs.php/pear/Pager_Sliding
Ну смешного тут мало, не преувеличивай!
Я тоже только сегодня обнаружил, что собственно плохо я учил математику, поэтому терь страдаю...

Свою регу я пока заменил на $end_str = substr($page,0,-1)*10;
Работает точно так же.
Беда осталась одна, Эта функция правильно делит список если только выводить по 10 элементов, если больше то начинаются глюки.

Классы из пеара не подходят, глупо использовать его, только для резки страниц.

Может всё-же кто нибудь подскажет как переписать эту функцию, чтоб правильно работала, и отдавала массив с номерами страниц.
PHP:
$count = 525; // Страниц всего
$max_res_page = 10; // По сколько разделять
$page = 12; // Текущая

function page($count,$max_res_page=10,$page=1) {
	if (($page%$max_res_page) != 0) {
		$end_str = substr($page,0,-1)*10;
	} else $end_str = $page-1;
	$str = $end_str;
	$end = $str+$max_res_page;
	if ($str<=1) $str = 1;
	if ($end>=$count) $end = $count;
	for ($i=$str; $i <= $end; $i++) {
		$list[] = $i;
	}
	return $list;
}
 

jeka!

Просто Member
jeka мой вариант зато работает попробуй и будет тебе щастье

Твой вариант мне не подходит, он листает все страницы по очереди, нужно чтоб был список:
1 2 3 4 5 6 7 8 9 10
Если я нахожусь на 5 странице, то список должен быть неизменным:
1 2 3 4 5 6 7 8 9 10
И только когда находишься на 10, должно быть так:
9 10 11 12 13 14 15 16 17 18 19

Ну можно ещё так как тут сделано:
http://top.mail.ru/Rating/Humor/Today/Hosts/11.html

А твой пример я юзал изначально, и у меня такая функция уже была готова, в общем не устраивает...
 

jeka!

Просто Member
Господа, нежели чем только прикалываться, взяли бы и написали пример.
А то одни только понты, вот напишите как нужно, и посмотрим вашу грамотность.
Я задаю вопросы только по необходимости, а не от того что мне влом самому придумывать.
А вот юморист Ромик шеф кроме как кинуть очередной понт ничего не может в реале. Чтож, если для вас так просто придумать и вычесть правильное выражение, вы поленились его тут привести?
 

wanderer

PHP - rulez!...
это мой старый код (писал очень давно), так что он уже морально устарел =) но может тебе поможет
как говориться as is.
PHP:
for ($c=0;$c<22;$c++){ $posts[$c]="post$c"; }

$all_pages = ceil(count($posts) / 10);
echo "Всего страниц: $all_pages<Br>\r\n";
if (!isset($page)) { $page = 0; }
if ($page) { $bp = $page - 1; echo "<A Href=$PHP_SELF?page=$bp><< назад</A> |"; }

for ($c = 0; $c < $all_pages; $c++) {
  $sc = $c + 1;
  if ($all_pages < 7) {
    if ($c == $page) {
      echo " $sc |";
    } else {
      echo " <A Href=$PHP_SELF?page=$c>$sc</A> |";
    }
  } else {
    if ($c == $page) {
      if ($c - 1 > 1 and $c < $all_pages - 1) {
        $bc = $c - 1;
        $bsc = $sc - 1;
        echo " <A Href=$PHP_SELF?page=$bc>$bsc</A> |";
      }
      echo " $sc |";
      if ($c + 1 < $all_pages - 2 and $c > 0) {
        $fc = $c + 1;
        $fsc = $sc + 1;
        echo " <A Href=$PHP_SELF?page=$fc>$fsc</A> |";
      }
      if ($c < $all_pages - 4 and $c + 1 != 1) {
        echo " ... |";
      }
    } else {
      if ($c < 2 or $c > $all_pages - 3) {
        echo " <A Href=$PHP_SELF?page=$c>$sc</A> |";
        if ((($c == 1 and $page > 2) or ($c - 1 == 0)) and $page != 2 and $c + 2 != $page) {
          echo " ... |";
        }
      }
    }
  }
}

if ($page < $all_pages - 1) { $fp = $page + 1; echo " <A Href=$PHP_SELF?page=$fp>вперёд >></A>"; }

echo "<Br>\r\n";
for ($c = $page * 10; $c < $page * 10 + 10; $c++) {
  echo "$posts[$c]<Br>\r\n";
}
 

jeka!

Просто Member
wanderer
Вот спасибо, хоть один добрый человек привёл пример, я поковыряю это.
А пока у меня работает старая функция, только с выводом по 10 страниц.
Вот можете посмотреть тут, наброски:
http://dissertations.ru/anekdot/
Дизайн весь на шаблонах. И все колличества вывода настраиваются, как нужно, только одна эта функция всё портит.
 
Сверху