Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Grupowanie elementów tablicy
Forum PHP.pl > Forum > PHP
sunpietro
Witam,
ostatnio męczę się nad grupowaniem elementów tablicy. W trakcie działania programu zostaje utworzona tablica:
Kod
Array (
    [0] => Array (
        [?projekt_nazwa] => Projekt nr 1
        [?projekt_opis] => <p>opis projektu</p>
        [?projekt_obraz] => 8246ee1a339805dc58198b9a08763950.png
    )
    [1] => Array (
        [?projekt_nazwa] => Projekt nr 1
        [?projekt_opis] => <p>opis projektu</p>
        [?projekt_obraz] => fcdb6e8a59d27792679f450cdd0f903a.png
    )
    [2] => Array (
        [?projekt_nazwa] => Projekt nr 1
        [?projekt_opis] => <p>opis projektu</p>
        [?projekt_obraz] => d660d08c57fb6b4c13388c1972e1574a.png
    )
    [3] => Array (
        [?projekt_nazwa] => Projekt nr 1
        [?projekt_opis] => <p>opis projektu</p>
        [?projekt_obraz] => d7ecc42d59bb1082f78420d764855d69.png
    )
    [4] => Array (
        [?projekt_nazwa] => War 1
        [?projekt_opis] => <p>Testowy projekt</p>
        [?projekt_obraz] => ecc258c8e9cf4b3cd62eaddf71b03b47.jpeg
    )
    [5] => Array (
        [?projekt_nazwa] => War 1
        [?projekt_opis] => <p>Testowy projekt</p>
        [?projekt_obraz] => b843abd4d45c08d3f3f6cf92c46410bd.jpg
    )
    [6] => Array (
        [?projekt_nazwa] => 1
        [?projekt_opis] =>
        [?projekt_obraz] =>
    )
    [7] => Array (
        [?projekt_nazwa] =>
        [?projekt_opis] => <p>Witam!</p>
        [?projekt_obraz] =>
    )
    [8] => Array (
        [?projekt_nazwa] => dfgd
        [?projekt_opis] => <p>fdd</p>
        [?projekt_obraz] =>
    )
    [9] => Array (
        [?projekt_nazwa] => Kreator
        [?projekt_opis] => <p>Projekty</p>
        [?projekt_obraz] =>
    )
    [10] => Array (
        [?projekt_nazwa] => Testowy
        [?projekt_opis] => <p>k,j</p>
        [?projekt_obraz] =>
    )
    [11] => Array (
        [?projekt_nazwa] => projekt 2
        [?projekt_opis] => <p>opissssssss drugi</p>
        [?projekt_obraz] =>
    )
)

Mój problem polega na tym, aby grupować elementy o tych samych atrybutach [?projekt_nazwa] , aby powstało coś w stylu:
Kod
Array (
    [0] => Array (
        [?projekt_nazwa] => Projekt nr 1
        [?projekt_opis] => <p>opis projektu</p>
        [?projekt_obraz] => 8246ee1a339805dc58198b9a08763950.png
        [?projekt_obraz] => fcdb6e8a59d27792679f450cdd0f903a.png
        [?projekt_obraz] => d660d08c57fb6b4c13388c1972e1574a.png
        [?projekt_obraz] => d7ecc42d59bb1082f78420d764855d69.png
    )
    [4] => Array (
        [?projekt_nazwa] => War 1
        [?projekt_opis] => <p>Testowy projekt</p>
        [?projekt_obraz] => ecc258c8e9cf4b3cd62eaddf71b03b47.jpeg
        [?projekt_obraz] => b843abd4d45c08d3f3f6cf92c46410bd.jpg
    )
    [8] => Array (
        [?projekt_nazwa] => dfgd
        [?projekt_opis] => <p>fdd</p>
        [?projekt_obraz] =>
    )
    [9] => Array (
        [?projekt_nazwa] => Kreator
        [?projekt_opis] => <p>Projekty</p>
        [?projekt_obraz] =>
    )
    [10] => Array (
        [?projekt_nazwa] => Testowy
        [?projekt_opis] => <p>k,j</p>
        [?projekt_obraz] =>
    )
    [11] => Array (
        [?projekt_nazwa] => projekt 2
        [?projekt_opis] => <p>opissssssss drugi</p>
        [?projekt_obraz] =>
    )
)

Prosiłbym o wskazówki, w którym kierunku mam podążać aby osiągnąć pożądany efekt.
bleblok
Pojawia się podstawowy problem: indeksy w tablicy asocjacyjnej nie mogą się powtarzać.
Obejdę trochę ten problem.

Zakładam, że pierwsza tablica to powiedzmy $tab1.

Tworzysz tablice indeksów - $indeksy.

Lecisz po kolei elementy tablicy $tab1 (może być foreach) i indeksujesz sobie klucze po których grupujesz sprawdzając czy wcześniej nie było już takiego indeksu.
Jeśli był, to pakujesz obrazek do tabeli wyjściowej o indeksie jaki wyciągniesz z $indeksy. Jeśli nie było to przepisujesz cały jeden element z $tab1 do $tab2.

  1. $indeksy = array();
  2. $tab2 = array();
  3. if (count($tab1))
  4. {
  5. foreach ($tab1 as $tab_i => $tab_v)
  6. {
  7. if (isset($indeksy[$tab_v['?projekt_nazwa']]))
  8. {
  9. $tab2[$indeksy[$tab_v['?projekt_nazwa']]]['?projekt_obraz']][] = $tab_v['?projekt_obraz']
  10. }else
  11. {
  12. $tab2[$tab_i] = array();
  13. $tab2[$tab_i]['?projekt_nazwa']] = $tab_v['?projekt_nazwa'];
  14. $tab2[$tab_i]['?projekt_opis']] = $tab_v['?projekt_opis'];
  15. $tab2[$tab_i]['?projekt_obraz']] = array();
  16. $tab2[$tab_i]['?projekt_obraz']][] = $tab_v['?projekt_obraz']
  17. $indeksy[$tab_v['?projekt_nazwa']] = $tab_i;
  18. }
  19.  
  20. }
  21. }
sunpietro
wielkie dzięki
oto mi właśnie chodziło smile.gif

Mam teraz trochę inny problem, ale podobny do powyższego. Różnica polega na tym, że występuje kilka takich powtórzeń:

TABLICA WEJŚCIOWA:
Kod
Array (
    [0] => Array (
        [?imie] => Jacek
        [?nazwisko] => Placek
        [?obraz] => 0bc171c32acc6550e986614718155da0.jpg
        [?projekt_nazwa] => Projekt 1
        [?id] => 1
        [?skill] => Machanie
        [?sport] => Tenis
    )
    [1] => Array (
        [?imie] => Jacek
        [?nazwisko] => Placek
        [?obraz] => 0bc171c32acc6550e986614718155da0.jpg
        [?projekt_nazwa] => Projekt 2
        [?id] => 1
        [?skill] => Kopanie
        [?sport] => Futbol
    )
    [2] => Array (
        [?imie] => Jacek
        [?nazwisko] => Placek
        [?obraz] => 0bc171c32acc6550e986614718155da0.jpg
        [?projekt_nazwa] => Projekt 1
        [?id] => 1
        [?skill] => Kopanie
        [?sport] => Tenis
    )
)


Powyższą tablicę przerabiam funkcją:
  1. private function arrayConvert($arr)
  2. {
  3. $indeksy = array();
  4. $tab = array();
  5. if (count($arr))
  6. {
  7. foreach ($arr as $tab_i => $tab_v)
  8. {
  9. if (isset($indeksy[$tab_v['?id']]))
  10. {
  11. $tab[$indeksy[$tab_v['?id']]]['?projekt_nazwa'][] = $tab_v['?projekt_nazwa'];
  12. $tab[$indeksy[$tab_v['?id']]]['?skill'][] = $tab_v['?skill'];
  13. $tab[$indeksy[$tab_v['?id']]]['?sport'][] = $tab_v['?sport'];
  14. }
  15. else
  16. {
  17. $tab[$tab_i] = array();
  18. $tab[$tab_i]['?id'] = $tab_v['?id'];
  19. $tab[$tab_i]['?imie'] = $tab_v['?imie'];
  20. $tab[$tab_i]['?nazwisko'] = $tab_v['?nazwisko'];
  21. $tab[$tab_i]['?obraz'] = $tab_v['?obraz'];
  22. $tab[$tab_i]['?projekt_nazwa'] = array();
  23. $tab[$tab_i]['?projekt_nazwa'][] = $tab_v['?projekt_nazwa'];
  24. $tab[$tab_i]['?skill'] = array();
  25. $tab[$tab_i]['?skill'][] = $tab_v['?skill'];
  26. $tab[$tab_i]['?sport'] = array();
  27. $tab[$tab_i]['?sport'][] = $tab_v['?sport'];
  28. $indeksy[$tab_v['?id']] = $tab_i;
  29. }
  30. }
  31. }
  32. return $tab;
  33. }


Na skutek czego powstaje mi taka TABLICA WYJŚCIOWA:
Kod
Array (
    [0] => Array (
        [?id] => 1
        [?imie] => Jacek
        [?nazwisko] => Placek
        [?obraz] => 0bc171c32acc6550e986614718155da0.jpg
        [?projekt_nazwa] => Array (
            [0] => Projekt 1
            [1] => Projekt 2
            [2] => Projekt 1
            [3] => Projekt 2
            [4] => Projekt 1
            [5] => Projekt 2
            [6] => Projekt 1
            [7] => Projekt 2
        )
        [?skill] => Array (
            [0] => Machanie
            [1] => Machanie
            [2] => Kopanie
            [3] => Kopanie
            [4] => Machanie
            [5] => Machanie
            [6] => Kopanie
            [7] => Kopanie
        )
        [?kurs] => Array (
            [0] => Tenis
            [1] => Tenis
            [2] => Tenis
            [3] => Tenis
            [4] => Futbol
            [5] => Futbol
            [6] => Futbol
            [7] => Futbol
        )
    )
)


Chciałbym uniknąć tego powtarzania się (tworzy się iloczyn kartezjański?). Jak to można zmodyfikować?
Array_unique mi wyświetla tylko jedną pozycję z danej podtablicy.
Prosiłbym o pomoc w naprowadzeniu na rozwiązanie.

=====================

Znalazłem rozwiązanie.
Należy się posłuzyć if i funkcją in_array()
  1. private function arrayConvert($arr)
  2. {
  3. $indeksy = array();
  4. $tab = array();
  5. if (count($arr))
  6. {
  7. foreach ($arr as $tab_i => $tab_v)
  8. {
  9. if (isset($indeksy[$tab_v['?id']]))
  10. {
  11. if(!in_array($tab_v['?projekt_nazwa'], $tab[$indeksy[$tab_v['?id']]]['?projekt_nazwa']))
  12. $tab[$indeksy[$tab_v['?id']]]['?projekt_nazwa'][] = $tab_v['?projekt_nazwa'];
  13. .........
  14. .........
  15. }
  16. else
  17. {
  18. $tab[$tab_i] = array();
  19. $tab[$tab_i]['?id'] = $tab_v['?id'];
  20. $tab[$tab_i]['?imie'] = $tab_v['?imie'];
  21. $tab[$tab_i]['?nazwisko'] = $tab_v['?nazwisko'];
  22. $tab[$tab_i]['?obraz'] = $tab_v['?obraz'];
  23. $tab[$tab_i]['?projekt_nazwa'] = array();
  24. $tab[$tab_i]['?projekt_nazwa'][] = $tab_v['?projekt_nazwa'];
  25. $tab[$tab_i]['?skill'] = array();
  26. $tab[$tab_i]['?skill'][] = $tab_v['?skill'];
  27. $tab[$tab_i]['?sport'] = array();
  28. $tab[$tab_i]['?sport'][] = $tab_v['?sport'];
  29. $indeksy[$tab_v['?id']] = $tab_i;
  30. }
  31. }
  32. }
  33. return $tab;
  34. }

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.