Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Grupowanie elementow tablicy
Forum PHP.pl > Forum > PHP
miszz
Dzień dobry,

mam sobie n-elementową tablicę:
  1. (
  2. [0] => Array
  3. (
  4. [surowiec_rodzaj] => 1000-1200
  5. [surowiec_cecha3] => DUZO
  6. [surowiec_cecha4] => X
  7. [surowiec_cecha5] => Y
  8. [surowiec_cecha6] => Z
  9. [produkt_id] => K22222
  10. [wynik] => 0.00042
  11. [jm] => szt
  12. )
  13.  
  14. [1] => Array
  15. (
  16. [surowiec_rodzaj] => 114-41
  17. [surowiec_cecha3] => DUZO
  18. [surowiec_cecha4] => X
  19. [surowiec_cecha5] => Y
  20. [surowiec_cecha6] => Z
  21. [produkt_id] => N111111
  22. [wynik] => 4.4
  23. [jm] => szt
  24. )
  25. [2] => Array
  26. (
  27. [surowiec_rodzaj] => 114-41
  28. [surowiec_cecha3] => MALO
  29. [surowiec_cecha4] => x
  30. [surowiec_cecha5] => Y
  31. [surowiec_cecha6] => Z
  32. [produkt_id] => ASD7888
  33. [wynik] => 4.4
  34. [jm] => szt
  35. )
  36. }


Zastanawiam się jak pogrupować elementy ze względu na podobieństwo cech (surowiec_cecha3 do surowiec_cecha6).
Czyli pętla sobie leci sprawdzając jednocześnie czy w tablicy nie istnieje rekord z podobnymi cechami jeśli tak wyświetli je w jednym wierszu jeśli nie łamie linie.
K22222 - 1000-120_DUZO_X_Y_Z N111111 - 114-41_DUZO_X_Y_Z \n
ASD7888 - 114-41_MALO_X_Y_Z

proszę o podpowiedź jak się powinienem zorganizować z tym..
tehaha
może zacznij od sprecyzowania co to jest według Ciebie "podobna cecha"?

@DOWN: tylko, że ten przykład trochę sugeruję jakby ta segregacja miała być tylko odnośnie pola DUZO/MALO bo przedostatni i ostatni tylko tym się różnią a są w innych liniach czyli według autora nie są podobne
thek
tehaha... Może ja źle zrozumiałem, ale według autora surowiec_cecha3, surowiec_cecha4, surowiec_cecha5 i surowiec_cecha6 powinny być albo identyczne albo w dużym stopniu podobne (3/4 identyczne?)
miszz
Już precyzuję ,

tak jak domniemywał Pan @thek cechą , a właściwie cechami nazwałem: surowiec_cecha3, surowiec_cecha4, surowiec_cecha5 i surowiec_cecha6.
Reasumując jeśli wartości rzeczonych cech (surowiec_cecha3, surowiec_cecha4, surowiec_cecha5 i surowiec_cecha6) występują już gdzieś w tablicy, następuje grupowanie. Ale jeśli choćby jedna cecha się różni takowe grupowanie nie występuje.
W tym cały szkopuł, że nie potrafię tego ugryźć..
tehaha
Cytat
Ale jeśli choćby jedna cecha się różni takowe grupowanie nie występuje.
czyli po prostu wszystkie 4 muszą być identyczne.

Ja bym to zrobił tak, że z tych 4 utworzyłbym unikatowy klucz w innej wielowymiarowej tablicy i tam tworzył grupy tablic z tymi samymi cechami

kod:
  1. $array = Array
  2. (
  3. "0" => Array
  4. (
  5. "surowiec_rodzaj" => "1000-1200",
  6. "surowiec_cecha3" => "DUZO",
  7. "surowiec_cecha4" => "X",
  8. "surowiec_cecha5" => "Y",
  9. "surowiec_cecha6" => "Z",
  10. "produkt_id" => "K22222",
  11. "wynik" => "0.00042",
  12. "jm" => "szt"
  13. ),
  14.  
  15. "1" => Array
  16. (
  17. "surowiec_rodzaj" => "114-41",
  18. "surowiec_cecha3" => "DUZO",
  19. "surowiec_cecha4" => "X",
  20. "surowiec_cecha5" => "Y",
  21. "surowiec_cecha6" => "Z",
  22. "produkt_id" => "N111111",
  23. "wynik" => "4.4",
  24. "jm" => "szt"
  25. ),
  26. "2" => Array
  27. (
  28. "surowiec_rodzaj" => "114-41",
  29. "surowiec_cecha3" => "MALO",
  30. "surowiec_cecha4" => "x",
  31. "surowiec_cecha5" => "Y",
  32. "surowiec_cecha6" => "Z",
  33. "produkt_id" => "ASD7888",
  34. "wynik" => "4.4",
  35. "jm" => "szt"
  36. ),
  37. "3" => Array
  38. (
  39. "surowiec_rodzaj" => "114-41",
  40. "surowiec_cecha3" => "MALO",
  41. "surowiec_cecha4" => "x",
  42. "surowiec_cecha5" => "Y",
  43. "surowiec_cecha6" => "E",
  44. "produkt_id" => "ASD7888",
  45. "wynik" => "4.4",
  46. "jm" => "szt"
  47. ),
  48. "4" => Array
  49. (
  50. "surowiec_rodzaj" => "114-41",
  51. "surowiec_cecha3" => "MALO",
  52. "surowiec_cecha4" => "x",
  53. "surowiec_cecha5" => "Y",
  54. "surowiec_cecha6" => "E",
  55. "produkt_id" => "ASD7888",
  56. "wynik" => "4.4",
  57. "jm" => "szt"
  58. ),
  59. "5" => Array
  60. (
  61. "surowiec_rodzaj" => "114-41",
  62. "surowiec_cecha3" => "MALO",
  63. "surowiec_cecha4" => "x",
  64. "surowiec_cecha5" => "Y",
  65. "surowiec_cecha6" => "E",
  66. "produkt_id" => "ASD7888",
  67. "wynik" => "4.4",
  68. "jm" => "szt"
  69. ),
  70. "6" => Array
  71. (
  72. "surowiec_rodzaj" => "114-41",
  73. "surowiec_cecha3" => "SREDNIO",
  74. "surowiec_cecha4" => "x",
  75. "surowiec_cecha5" => "Y",
  76. "surowiec_cecha6" => "E",
  77. "produkt_id" => "ASD7888",
  78. "wynik" => "4.4",
  79. "jm" => "szt"
  80. ),
  81. );
  82. $sorted = array();
  83.  
  84.  
  85. foreach($array as $key=>$value)
  86. {
  87. $unique_key = md5(strtolower($value['surowiec_cecha3'])."-".strtolower($value['surowiec_cecha4'])."-".strtolower($value['surowiec_cecha5'])."-".strtolower($value['surowiec_cecha6']));
  88.  
  89. if(array_key_exists($unique_key,$sorted))
  90. {
  91. $sorted[$unique_key][] = $value;
  92. }else
  93. {
  94. $sorted[$unique_key] = array();
  95. $sorted[$unique_key][] = $value;
  96. }
  97. }
  98. //print sorted arrays in one line per group
  99. foreach($sorted as $value)
  100. {
  101. foreach($value as $val)
  102. {
  103. echo $val['produkt_id']." - ".$val['surowiec_rodzaj']." ".$val['surowiec_cecha3']."_".$val['surowiec_cecha4']."_".$val['surowiec_cecha5']."_".$val['surowiec_cecha6']."    ";
  104. }
  105. echo "<br/>";
  106. }


daje mi taki wynik:
K22222 - 1000-1200 DUZO_X_Y_Z N111111 - 114-41 DUZO_X_Y_Z
ASD7888 - 114-41 MALO_x_Y_Z
ASD7888 - 114-41 MALO_x_Y_E ASD7888 - 114-41 MALO_x_Y_E ASD7888 - 114-41 MALO_x_Y_E
ASD7888 - 114-41 SREDNIO_x_Y_E

czyli w każdej linii tablice z tymi samymi cechami
miszz
Witam,
sam bym na to nie wpadł - bardzo dziękuje.
Podczepię się jeszcze pond temat, mianowicie zastanawiam się jak usunąć zdublowane klucze. Mianowicie klucz 1==2, 6==7.. i trzeba było by w jakiś sprytny sposób usunąć zostawiając tylko 1 z nich. Sytuacja jest prosta jeśli jest to bardziej płaska tablica - wzorując się na rozwiązaniu tehaha. Jednak jeśli chodzi o takową nie umiem sobie poradzić.

  1. $array = Array
  2. (
  3. "0" => Array
  4. (
  5. "0" => Array
  6. (
  7. "wynik" => "0.048",
  8. "surowiec_rodzaj" => "1000-1200",
  9. "surowiec_cecha3" => "�ADUNKOWA-STD-JD-ANG",
  10. "surowiec_cecha4" => "BEZ-OZNACZE�",
  11. "surowiec_cecha5" => "Wybierz",
  12. "surowiec_cecha6" => "Wybierz",
  13. "surowiec_grupa" => "PALETA",
  14. "jm" => "szt",
  15. "produkt_id" => "NG81952"
  16. )
  17.  
  18. ),
  19.  
  20. "1" => Array
  21. (
  22. "0" => Array
  23. (
  24. "wynik" => "0.1",
  25. "surowiec_rodzaj" => "114-41",
  26. "surowiec_cecha3" => "ZWYK�A-JEDNORZ�DOWA-ROLKA",
  27. "surowiec_cecha4" => "BIA�A/IND-5291",
  28. "surowiec_cecha5" => "Wybierz",
  29. "surowiec_cecha6" => "Wybierz",
  30. "surowiec_grupa" => "ETYKIETA",
  31. "jm" => "szt",
  32. "produkt_id" => "D79018N"
  33. ),
  34.  
  35. "1" => Array
  36. (
  37. "wynik" => "20.0",
  38. "surowiec_rodzaj" => "114-41",
  39. "surowiec_cecha3" => "ZWYK�A-JEDNORZ�DOWA-ROLKA",
  40. "surowiec_cecha4" => "BIA�A/IND-5291",
  41. "surowiec_cecha5" => "Wybierz",
  42. "surowiec_cecha6" => "Wybierz",
  43. "surowiec_grupa" => "ETYKIETA",
  44. "jm" => "zt",
  45. "produkt_id" => "NG81952"
  46. )
  47.  
  48. ),
  49.  
  50. "2" => Array
  51. (
  52. "0" => Array
  53. (
  54. "wynik" => "0.1",
  55. "surowiec_rodzaj" => "114-41",
  56. "surowiec_cecha3" => "ZWYK�A-JEDNORZ�DOWA-ROLKA",
  57. "surowiec_cecha4" => "BIA�A/IND-5291",
  58. "surowiec_cecha5" => "Wybierz",
  59. "surowiec_cecha6" => "Wybierz",
  60. "surowiec_grupa" => "ETYKIETA",
  61. "jm" => "szt",
  62. "produkt_id" => "D79018N"
  63. ),
  64.  
  65. "1" => Array
  66. (
  67. "wynik" => "20.0",
  68. "surowiec_rodzaj" => "114-41",
  69. "surowiec_cecha3" => "ZWYK�A-JEDNORZ�DOWA-ROLKA",
  70. "surowiec_cecha4" => "BIA�A/IND-5291",
  71. "surowiec_cecha5" => "Wybierz",
  72. "surowiec_cecha6" => "Wybierz",
  73. "surowiec_grupa" => "ETYKIETA",
  74. "jm" => "szt",
  75. "produkt_id" => "NG81952"
  76. )
  77.  
  78. ),
  79.  
  80. "3" => Array
  81. (
  82. "0" => Array
  83. (
  84. "wynik" => "0.19",
  85. "surowiec_rodzaj" => "120/1000-700",
  86. "surowiec_cecha3" => "AMBER-GRAPHIC",
  87. "surowiec_cecha4" => "Wybierz",
  88. "surowiec_cecha5" => "Wybierz",
  89. "surowiec_cecha6" => "Wybierz",
  90. "surowiec_grupa" => "PAPIER",
  91. "jm" => "KG",
  92. "produkt_id" => "NG81952"
  93. )
  94.  
  95. ),
  96.  
  97. "4" => Array
  98. (
  99. "0" => Array
  100. (
  101. "wynik" => "0.03334",
  102. "surowiec_rodzaj" => "127-76",
  103. "surowiec_cecha3" => "ZWYK�A-JEDNORZ�DOWA-ROLKA",
  104. "surowiec_cecha4" => "BIA�A/IND-5725",
  105. "surowiec_cecha5" => "Wybierz",
  106. "surowiec_cecha6" => "Wybierz",
  107. "surowiec_grupa" => "ETYKIETA",
  108. "jm" => "szt",
  109. "produkt_id" => "D79018N"
  110. )
  111.  
  112. ),
  113.  
  114. "5" => Array
  115. (
  116. "0" => Array
  117. (
  118. "wynik" => "0.2",
  119. "surowiec_rodzaj" => "1300-100-100",
  120. "surowiec_cecha3" => "NARO�NIK",
  121. "surowiec_cecha4" => "Wybierz",
  122. "surowiec_cecha5" => "Wybierz",
  123. "surowiec_cecha6" => "Wybierz",
  124. "surowiec_grupa" => "PUDŁA",
  125. "jm" => "szt",
  126. "produkt_id" => "NG81952"
  127. )
  128.  
  129. ),
  130.  
  131. "6" => Array
  132. (
  133. "0" => Array
  134. (
  135. "wynik" => "0.0245",
  136. "surowiec_rodzaj" => "280/700-1000",
  137. "surowiec_cecha3" => "MAKULATUROWA",
  138. "surowiec_cecha4" => "Wybierz",
  139. "surowiec_cecha5" => "Wybierz",
  140. "surowiec_cecha6" => "Wybierz",
  141. "surowiec_grupa" => "TEKTURA",
  142. "jm" => "KG",
  143. "produkt_id" => "D79018N"
  144. ),
  145.  
  146. "1" => Array
  147. (
  148. "wynik" => "2.45",
  149. "surowiec_rodzaj" => "280/700-1000",
  150. "surowiec_cecha3" => "MAKULATUROWA",
  151. "surowiec_cecha4" => "Wybierz",
  152. "surowiec_cecha5" => "Wybierz",
  153. "surowiec_cecha6" => "Wybierz",
  154. "surowiec_grupa" => "TEKTURA",
  155. "jm" => "KG",
  156. "produkt_id" => "NG81952"
  157. )
  158.  
  159. ),
  160.  
  161. "7" => Array
  162. (
  163. "0" => Array
  164. (
  165. "wynik" => "0.0245",
  166. "surowiec_rodzaj" => "280/700-1000",
  167. "surowiec_cecha3" => "MAKULATUROWA",
  168. "surowiec_cecha4" => "Wybierz",
  169. "surowiec_cecha5" => "Wybierz",
  170. "surowiec_cecha6" => "Wybierz",
  171. "surowiec_grupa" => "TEKTURA",
  172. "jm" => "KG",
  173. "produkt_id" => "D79018N"
  174. ),
  175.  
  176. "1" => Array
  177. (
  178. "wynik" => "2.45",
  179. "surowiec_rodzaj" => "280/700-1000",
  180. "surowiec_cecha3" => "MAKULATUROWA",
  181. "surowiec_cecha4" => "Wybierz",
  182. "surowiec_cecha5" => "Wybierz",
  183. "surowiec_cecha6" => "Wybierz",
  184. "surowiec_grupa" => "TEKTURA",
  185. "jm" => "KG",
  186. "produkt_id" => "NG81952"
  187. )
  188.  
  189. )
  190.  
  191. );
tehaha
hej wystarczy tutaj prosta modyfikacja tego co CI już dałem, a mianowicie do oddzielnej tablicy zbieramy id produktów, które już umieściliśmy w tablicy i jeżeli został już wykorzystany to go nie dodajemy:
  1. $sorted = array();
  2. $used_ids = array();
  3.  
  4. foreach($array as $key=>$value)
  5. {
  6. $unique_key = md5(strtolower($value['surowiec_cecha3'])."-".strtolower($value['surowiec_cecha4'])."-".strtolower($value['surowiec_cecha5'])."-".strtolower($value['surowiec_cecha6']));
  7. if(!in_array($value['produkt_id'], $used_ids))
  8. {
  9. if(array_key_exists($unique_key,$sorted))
  10. {
  11. $sorted[$unique_key][] = $value;
  12. }else
  13. {
  14. $sorted[$unique_key] = array();
  15. $sorted[$unique_key][] = $value;
  16. }
  17. $used_ids[] = $value['produkt_id'];
  18. }
  19. }
  20. //print sorted arrays in one line per group
  21. foreach($sorted as $value)
  22. {
  23. foreach($value as $val)
  24. {
  25. echo $val['produkt_id']." - ".$val['surowiec_rodzaj']." ".$val['surowiec_cecha3']."_".$val['surowiec_cecha4']."_".$val['surowiec_cecha5']."_".$val['surowiec_cecha6']." &nbsp;&nbsp; ";
  26. }
  27. echo "<br/>";
  28. }
miszz
Cześć,

nie bardzo chce działać w oparciu o nową tablicę jaką przedstawiłem powyżej. Czyli układ jest bardziej złożony 2-stopniowy to właśnie mi gmatwa strasznie sprawę. Sam pomysł z wykorzystaniem md5 jest wprost genialny..
  1. 1 array {
  2. 1 array {}
  3. 2 array {}
  4. }
  5. 2 array {
  6. 1 array {}
  7. 2 array {}
  8. }
  9. 3 array {
  10. 1 array {}
  11. }
  12. 4 array {
  13. 1 array {}
  14. 2 array {}
  15. }
  16. }

Chyba, że coś ja sknociłem przy testowaniu.
tehaha
no ale czy ta nowa tablica to nie jest wynik tego skryptu, który Ci podałem czyli po podziale na grupy? ta modyfikacja co teraz zrobiłem to dotyczy tej pierwotnej tablicy, że przy grupowaniu można od razu pominąć zdublowane rekordy
miszz
Nie, nie jest. Tamten kod spisuje się należycie, teraz powstał właśnie nowy problem przy zupełnie innym podejściu (nowej tablicy - podobne dane wyjsciowe).
everth
Możesz podobną konstrukcję zastosować nawet bez md5 (odpada jakieś tam minimalistyczne prawdopodobieństwo kolizji i samo liczenie sum)
  1. Budujesz sobie płaską tabelę (indeks) która zawiera referencje do wszystkich tabel w drzewie -> array_walk_recursive().
  2. Stosujesz na niej array_diff_key(indeks,array_unique(indeks)) - otrzymujesz tablicę zawierającą nadmiarowe tablice w drzewie - nullujesz je w indeksie (jednocześnie usuwając z drzewa).
  3. Teraz powinno wystarczyć oczyszczenie drzewa z kluczy zawierających wartość NULL np. za pomocą array_walk_recursive().

W zasadzie podobne indeksy możesz zbudować do każdego interesującego cię elementu (np id_produktu, cecha) i za i pomocą odwoływać się do odpowiednich tabel w drzewie.
tehaha
no to musisz po prostu przepisać tą tablicę używając do tego kilku pętli foreach(), umieszczasz użyte id w oddzielnej tablicy i funkcją in_array() sprawdzasz czy taka tablica została już wykorzystana jeśli tak to już jej nie wsadzasz do tej nowej
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.