Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem ze znalezieniem odpowiedniego przedziału
Majkelo23
post
Post #1





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

Ostrzeżenie: (0%)
-----


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)? (IMG:style_emoticons/default/smile.gif)

Ten post edytował Majkelo23 16.11.2013, 14:10:26
Go to the top of the page
+Quote Post
Greg0
post
Post #2





Grupa: Zarejestrowani
Postów: 264
Pomógł: 54
Dołączył: 31.08.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


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));
Go to the top of the page
+Quote Post
Majkelo23
post
Post #3





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

Ostrzeżenie: (0%)
-----


Tak, dokładnie takiej odpowiedz się spodziewałem - "tego nie wykorzystuje się w paginacji, kropka".
Go to the top of the page
+Quote Post
Greg0
post
Post #4





Grupa: Zarejestrowani
Postów: 264
Pomógł: 54
Dołączył: 31.08.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/biggrin.gif) ) od 14 miało być nie 24

Ten post edytował Greg0 16.11.2013, 14:59:30
Go to the top of the page
+Quote Post
Majkelo23
post
Post #5





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

Ostrzeżenie: (0%)
-----


Limit w zapytaniu powinien wyglądać wtedy tak:

  1. LIMIT $offet, $limit;


(IMG:style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
Greg0
post
Post #6





Grupa: Zarejestrowani
Postów: 264
Pomógł: 54
Dołączył: 31.08.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Dokładnie tak. Następnym razem pytajnik w bardziej widocznym miejscu (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.09.2025 - 19:03