Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Podział na grupy
Forum PHP.pl > Forum > PHP
Krzychur
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
kszychu
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. ?>
Krzychur
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)
}
FiDO
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.
matrach
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
Krzychur
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.
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.