Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem ze znalezieniem odpowiedniego przedziału
Forum PHP.pl > Forum > PHP
Majkelo23
Witam!

Pracuję nad uniwersalną funkcją, która znajdzie mi odpowiedni przedział dla liczb. W późniejszym etapie chcę wykorzystać ją do paginacji.

  1. function get_id_start($num_items, $id)
  2. {
  3. $board_config['adverts_per_page'] = 10; // ile wyników na stronę
  4.  
  5. $id = intval($id);
  6.  
  7. if ( $id <= 0 )
  8. {
  9. return 0;
  10. }
  11.  
  12. $total_pages = ceil($num_items/$board_config['adverts_per_page']); // ile będzie wszystkich stron
  13. $floor_num = $num_items; // wszystkich wyników do wyświetlenia
  14. $floor_num += (10-($floor_num%10)); // zaokrąglamy w górę wszystkie wyniki - do dziesiątek, czyli liczba 31 jest równa 40 itd.
  15.  
  16. for($i=0; $i<=($total_pages-1); $i++)
  17. {
  18. $start = $floor_num-(($i+1)*$board_config['adverts_per_page']);
  19. $end = $floor_num-($i*$board_config['adverts_per_page']);
  20.  
  21. if ( $id >= $start && $id <= $end )
  22. {
  23. return $start;
  24. }
  25. else if ( $i == 0 && $id > $end )
  26. {
  27. return $start;
  28. }
  29. }
  30. }
  31.  
  32. 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:

  1. function get_id_start($num_items, $id)
  2. {
  3. $board_config['adverts_per_page'] = 3;
  4.  
  5. $id = intval($id);
  6.  
  7. if ( $id <= 0 )
  8. {
  9. return 0;
  10. }
  11.  
  12. $total_pages = ceil($num_items/$board_config['adverts_per_page']);
  13.  
  14. for($i=0; $i<=($total_pages-1); $i++)
  15. {
  16. $start = $num_items-(($i+1)*$board_config['adverts_per_page']);
  17. $end = $num_items-($i*$board_config['adverts_per_page']);
  18.  
  19. echo $start.' --> '.$end.'<br>';
  20.  
  21. if ( $id >= $start && $id <= $end )
  22. {
  23. return $start;
  24. }
  25. else if ( $i == 0 && $id > $end )
  26. {
  27. return $start;
  28. }
  29. }
  30. }
  31.  
  32. var_dump(get_id_start(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)? smile.gif
Greg0
Jeśli chcesz te funkcje wykorzystać tylko i wyłącznie do paginacji to źle podszedłeś do problemu. A jeśli chcesz sprawdzać czy znajduje się w danym przedziale wystarczy:
  1. $range = range(1, 10);
  2. var_dump(in_array(7, $range));
Majkelo23
Tak, dokładnie takiej odpowiedz się spodziewałem - "tego nie wykorzystuje się w paginacji, kropka".
Greg0
Do paginacji wykorzystuje się odpowiednie liczby podawane w zapytaniu do LIMIT.
A dokładnie potrzebne są:
  1. $limit = 7; // Limit wyników na stronę
  2. $page = 3; // Numer aktualnej strony (zazwyczaj pobierana z GET)
  3. $offset = $page*$limit-$limit; // Numer rekordu od którego zaczynamy pobierać wyniki
  4.  
  5. // Dla siedmiu wyników na 3 stronie należy pobrać 7 rekordów zaczynając od 14 (dość prosta matematyka myślę)


@szybka edycja wkradł się błąd (taka prosta matematyka biggrin.gif) od 14 miało być nie 24
Majkelo23
Limit w zapytaniu powinien wyglądać wtedy tak:

  1. LIMIT $offet, $limit;


questionmark.gif
Greg0
Dokładnie tak. Następnym razem pytajnik w bardziej widocznym miejscu wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.