Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Podział na grupy
Krzychur
post 5.05.2006, 13:30:15
Post #1





Grupa: Zarejestrowani
Postów: 214
Pomógł: 0
Dołączył: 3.01.2004
Skąd: Łódź

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


Witam!

Zakładamy, że są 3 liczby naturalne X, Y, Z.

X to ilość elementów w pewnym zbiorze
Y to ilość grup, na które chcemy ten zbiór podzielić
Z to nr grupy, którą chcemy wyświetlić

Dzieląc np. 83 na 5 grup zostanie nam troszkę reszty (3), więc tą trójkę rozkładamy pojedynczo na 3 pierwsze grupy więc powstają nam takie grupy:

1 = od 0 do 16
2 = od 17 do 33
3 = od 34 do 50
4 = od 51 do 66
5 = od 67 do 82

Numery tak naprawdę przedstawiają indexy w tablicach, które tworzone są automatycznie, stąd fakt, że pierwsza grupa zaczyna się zerem, a ostatnia kończy się 82.

Stworzyłem na szybko taką funkcje, która zwraca mi tablicę z odpowiadającymi indexami danej grupy, powiedzcie czy zrobilibyście to zupełnie inaczej, czy... czekam na uwagi.

  1. <?php
  2. function part($count,$groups,$group) {
  3. $min = floor($count / $groups);
  4.  
  5. if ($group <= $count - $min * $groups) {
  6. $to = ($min + 1) * $group;
  7. $from = $to - $min;
  8. }
  9. else {
  10. $from = $count - $min * ($groups - $group + 1) ;
  11. $to = $from + $min;
  12. $from++;
  13. }
  14.  
  15. $array = array();
  16. for ($i = $from; $i <= $to; $i++) {
  17. $array[] = $i - 1;
  18. }
  19.  
  20. return $array;
  21. }
  22. ?>


Pozdrawiam!
Krzysiek


--------------------
Go to the top of the page
+Quote Post
kszychu
post 5.05.2006, 13:56:59
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 712
Pomógł: 23
Dołączył: 27.10.2003
Skąd: z kontowni

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


Ja bym to zrobił tak:
  1. <?php
  2. for($i = 0; $i < $y; $i++) {
  3. $wynik[$i] = 0;
  4. }
  5. while($x > 0) {
  6. for($i = 0; $i < $y; $i++) {
  7. $wynik[$i]++;
  8. $x--;
  9. if($x == 0) break;
  10. }
  11. }
  12. print_r($wynik);
  13. ?>


--------------------
"Coś się kończy, coś się zaczyna." Andrzej Sapkowski
Go to the top of the page
+Quote Post
Krzychur
post 5.05.2006, 14:08:36
Post #3





Grupa: Zarejestrowani
Postów: 214
Pomógł: 0
Dołączył: 3.01.2004
Skąd: Łódź

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


Kszychu, mój imenniku: mi nie chodzi o wyświetlenie po ile grupy mają elementów (aczkolwiek, ładnie to Ci wyszło), tylko o wyświetlenie numerów [indexów], które będą znajdować się w tej grupie.

---

Moje zastosowanie dla
x/y/z 83/5/2 zwraca:array(17) {
[0]=> float(17)
[1]=> float(18)
[2]=> float(19)
[3]=> float(20)
[4]=> float(21)
[5]=> float(22)
[6]=> float(23)
[7]=> float(24)
[8]=> float(25)
[9]=> float(26)
[10]=> float(27)
[11]=> float(28)
[12]=> float(29)
[13]=> float(30)
[14]=> float(31)
[15]=> float(32)
[16]=> float(33)
}

Ten post edytował Krzychur 5.05.2006, 14:09:56


--------------------
Go to the top of the page
+Quote Post
FiDO
post 5.05.2006, 15:04:34
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

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


Wg mnie troszke przekombinowales.

Ja bym to zrobil z grubsza tak:
  1. <?php
  2.  
  3. // 83, 5, 2
  4. function part($count, $groups, $group)
  5. {
  6. $groupSize = floor($count, $groups); // 16
  7. $rest = $count % $groups; // 3
  8.  
  9. $idx = ($group - 1) * $groupSize; // 16
  10.  
  11. $idx += min($rest, $group - 1); // idx = 17
  12.  
  13. // 17 + 16 + 0 = 33
  14. return range($idx, $idx + $groupSize + ($group <= $rest ? 0 : 1));
  15. }
  16.  
  17. ?>


PS. nie testowalem, pisze z pracy na szybko, wiec nie gwarantuje dzialania, ale sprawdze to pozniej.


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
matrach
post 5.05.2006, 15:13:37
Post #5





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 17.04.2006

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


A ja bym to zrobił tak:
  1. <?php
  2. function part($count,$groups,$group) {
  3. $array = range(0, $count);
  4. $pergroup = ceil($count / $groups);
  5. $array = array_chunk($array, $pergroup);
  6. if ($group > $groups)
  7. return $array[$groups - 1];
  8. else
  9.  return $array[$group - 1];
  10. }
  11.  
  12. ?>

Funkcja array_chunk dzieli tablice na części
Mam nadzieje żę o to ci chodzi tongue.gif
Go to the top of the page
+Quote Post
Krzychur
post 5.05.2006, 15:13:55
Post #6





Grupa: Zarejestrowani
Postów: 214
Pomógł: 0
Dołączył: 3.01.2004
Skąd: Łódź

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


FiDO, w przypadku 83,5,2 to się sprawdza, ale niestety dla np. 83,5,5 już pojawiają się nieprawidłowe wartości. Ale bardzo dobrze, że urzyłeś czegoś takiego jak range. Nigdy nie korzystałem z tej funkcji, a ona pozwoli mi usunąć pętle w mojej funkcji.

Teraz jest:
  1. <?php
  2. function part($count,$groups,$group) {
  3.         $min = floor($count / $groups);
  4.  
  5.         if ($group <= $count - $min * $groups) {
  6.                 $to = ($min + 1) * $group;
  7.                 $from = $to - $min;
  8.         }
  9.         else {
  10.                 $from = $count - $min * ($groups - $group + 1) ;
  11.                 $to = $from + $min;
  12.                 $from++;
  13.         }
  14.         
  15.         return range($from -1,$to -1);
  16. }
  17. ?>


Ta już przybiera kształty, które bardziej lubię smile.gif


----
matrach, niestety zobacz ostatni argument. Chunk dzieli w sposób taki, że pierwsze tablice mają maximium wartości, a ostatnia stanowi tylko dopełnienie.

Ten post edytował Krzychur 5.05.2006, 15:31:11


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 18.06.2025 - 13:03