Witam!
Pracuję nad __uniwersalną __funkcją, która znajdzie mi odpowiedni przedział dla liczb. W późniejszym etapie chcę wykorzystać ją do paginacji.
function get_id_start($num_items, $id)
{
$board_config['adverts_per_page'] = 10; // ile wyników na stronę
$id = intval($id);
if ( $id <= 0 )
{
return 0;
}
$total_pages = ceil($num_items/$board_config['adverts_per_page']); // ile będzie wszystkich stron
$floor_num = $num_items; // wszystkich wyników do wyświetlenia
$floor_num += (10-($floor_num%10)); // zaokrąglamy w górę wszystkie wyniki - do dziesiątek, czyli liczba 31 jest równa 40 itd.
for($i=0; $i<=($total_pages-1); $i++)
{
$start = $floor_num-(($i+1)*$board_config['adverts_per_page']);
$end = $floor_num-($i*$board_config['adverts_per_page']);
if ( $id >= $start && $id <= $end )
{
return $start;
}
else if ( $i == 0 && $id > $end )
{
return $start;
}
}
}
var_dump(get_id_start(31, 7));
Powyższa funkcja ma znaleźć przedział dla liczby 7, gdzie wszystkich wyników do wyświetlenia w sumie jest 31, a wyników na stronę ma być 10.
Pętla for zwraca coś mniej więcej takiego:
30 -> 40
20 -> 30
10 -> 20
0 -> 10
Czyli ta nasza siódemka mieści się w przedziale 0 - 10 (bo jest mniejsza od 10 i większa od 0).
Problem zaczyna się ze wspomnianą uniwersalnością... Próbując znaleźć przedział dla liczby 7, gdzie wszystkich wyników do wyświetlenia mamy 31, a wyników na stronę 3 (tutaj zmiana względem powyższego przykładu), wychodzą mi jakieś totalne głupoty. Mam funkcję, która dla tej trójki znajduje wszystkie przedziały poprawnie:
function get_id_start_pagination($num_items, $id)
{
$board_config['adverts_per_page'] = 3;
$id = intval($id);
if ( $id <= 0 )
{
return 0;
}
$total_pages = ceil($num_items/$board_config['adverts_per_page']);
for($i=0; $i<=($total_pages-1); $i++)
{
$start = $num_items-(($i+1)*$board_config['adverts_per_page']);
$end = $num_items-($i*$board_config['adverts_per_page']);
echo $start.' --> '.$end.'<br>';
if ( $id >= $start && $id <= $end )
{
return $start;
}
else if ( $i == 0 && $id > $end )
{
return $start;
}
}
}
var_dump(get_id_start_pagination(31, 7));
Funkcja zwróci przedziały:
28 --> 31
25 --> 28
22 --> 25
19 --> 22
16 --> 19
13 --> 16
10 --> 13
7 --> 10
4 --> 7
1 --> 4
a więc siódemka wchodzi w przedział 4 - 7.
Obie funkcje nie współpracują ze sobą, wypluwając błędnę wartości dla innych argumentów niż zaprezentowane przeze mnie powyżej.
Czy ktoś by mi mógł pomóc z tą matematyką, tak aby stworzyć jedną funkcję, która będzie uniwersalna (czyt. wypluwała dobre wartości, niezależnie od argumentów)? :)