Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Łączenie tablic
thoriam
post
Post #1





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 23.02.2012

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


witam wszystkich w swoim pierwszym poście (IMG:style_emoticons/default/wink.gif) . Otóż mam problem z łączeniem tablic. Mam tablice z zmieniającą się liczbą elementów.
  1. $tablica[] = $wartosc1;
  2. $tablica[] = $wartosc2;
  3. $tablica[] = $wartosc3;
  4. $tablica[] = $wartosc4;
  5. ///itd....
  6.  
  7. //zmienne wartosci to obiekty z rożnymi polami
  8.  

każdy element tablicy ma pole (tablice) 'dolacz' np.
  1. $tablica[0]->dolacz = array(1,4);

pole 'dolacz' wskazuje z jakimi indeksami ma dana tablica się połączyć a reszta żeby została dodana do kolejnych elementów tablicy żeby powstało coś takiego
  1. $koncowa_tablica[] = array($tablica[0],$tablica[1],$tablica[4]);
  2. $koncowa_tablica[] = array($tablica[2]);
  3. $koncowa_tablica[] = array($tablica[3]);
  4.  

proszę o nakierowanie na odpowiedni tok myślenia bo szczerze żaden mój pomysł nie wypalił
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
gothye
post
Post #2





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

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


array_merge
Go to the top of the page
+Quote Post
thoriam
post
Post #3





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 23.02.2012

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


tak manual umiem czytać być może ta funkcja mi się przyda ale jak ją wykorzystać w moim problemie??
Go to the top of the page
+Quote Post
thek
post
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Array_merge łączy tablice, a tu masz dołączanie elementów tablic do konkretnych elementów tablic (mogą być tablicami, ale nie muszą). Rozwiązanie nie jest trudne, bo to tylko utworzenie, z kilku elementów wskazywanych przez indeksy, jednego elementu nowej tablicy. Pojawiają się jednak pewne drobne pytania przy okazji, jak choćby fakt czy jakiś element może się powtórzyć w polu "dołącz" i na jakim etapie sama operacja "łączenia" występuje. Przykładowo różne elementy w tablicy dolacz wskazują te same elementy starej tablicy (tu element o indeksie 4)
  1. $tablica[0]->dolacz = array(1,4);
  2. $tablica[1]->dolacz = array(2,4);

Jest on po operacji transformacji w postaci:
  1. $tablica = array(
  2. array($tablica[0], $tablica[1], $tablica[4]),
  3. array($tablica[1], $tablica[2], $tablica[4])
  4. );

Czy ów nadmiarowy $tablica[4] w drugim elemencie istnieje czy nie?
A teraz inny przypadek... Czy w trakcie operacji transformacji tablica wynikowa jednego działania jest startową dla kolejnego działania (łańcuchowo), czy może mogą one być wykonane niezależnie i dopiero operacja na wszystkich polach dolacz tworzy wynik? Poza tym... Czy wykonanie operacji dołączania zeruje pole dolacz? Bo jeśli nie to łańcuchowe wywołanie potrafi stworzyć złe wyniki, gdzie tablica bedąca wyjściem łączenia po pierwszym kroku ma już inne elementy. Najprostszy wariant to: mogą się duplikować, robione jednocześnie - wynik dopiero ostatecznym. Przy okazji nie zapomnij sprawdzać, czy element istnieje (IMG:style_emoticons/default/smile.gif) Miałbyś bowiem wtedy zwykły foreach kopiujący elementy do nowej.
  1. $bazowa = TU_JAKAŚ_TABLICA_OBIEKTÓW_Z_ATRYBUTEM_DOLACZ; // tu miej sobie jakąś bazową
  2. $ostateczna = array(); // tu będziesz miał wyniki
  3. $elements_used = array(); // tu masz pomocniczą, która sprawdza czy element był już wykorzystany, przydaje się pod koniec do eliminacji już użytych... sam zobaczysz ;)
  4. foreach($bazowa AS $key => $element)
  5. {
  6. if(property_exists('dolacz', $element) && is_array($element->dolacz) && count($element->dolacz) > 0) // sprawdzamy czy element posiada własność property i jest ona niepustą tablicą
  7. {
  8. $temp_element = array($bazowa[$key]); //jeśli jest OK, to bierzemy ten element jako tablica tymczasowa...
  9. if(array_search($key, $elements_used) === FALSE) // ... sprawdzamy czy był już w użytych...
  10. {
  11. $elements_used[] = $key; // ...jeśli nie, dodajemy do użytych...
  12. }
  13. foreach($element->dolacz AS $used) // ...iterujemy po kolejnych indeksach kluczy wskazanych jako elementy dołączane...
  14. {
  15. if(array_key_exists($used, $bazowa)) // ...najpierw sprawdzajac czy są...
  16. {
  17. $temp_element[] = $bazowa[$used]; // ...jeśli są to dołączamy do tymczasowej...
  18. if(array_search($used, $elements_used) === FALSE) // ... sprawdzamy czy był element już użyty...
  19. {
  20. $elements_used[] = $used; // ... jesli nie to odajemy do użytych...
  21. }
  22. }
  23. }
  24. $ostateczna[] = $temp_element; // ... i wstawiamy do tablicy wynikowej.
  25. }
  26. }
  27. foreach($elements_used AS $value) // teraz iterujemy się po elementach użytych...
  28. {
  29. unset($bazowa[$value]); // ... i usuwamy je :)
  30. }
  31. foreach($bazowa AS $value) // to są już niedobitki...
  32. {
  33. $ostateczna[] = $value; // ... które dodajemy do wynikowej
  34. }

Oczywiście to tylko jedna z możliwych implementacji, zależnie co kod ma robić. Mój przykład zakłada, że:
1) Pola zawierające tablicę w polu polacz są priorytetowo obsługiwane i jej brak powoduje przerzucenie na koniec obsługi, po eliminacji elementów wskazywanych przez tablice dolacz, co Twój przykład wskazuje jako docelowe działanie.
2) Elementy są kopiowane wielokrotnie jeśli pole dolacz dla rożnych obiektów wskazuje na ten sam.
3) Nie usuwamy z wynikowej tablicy pól dolacz, mimo iż w późniejszych etapach mogą wprowadzić błędy. Chcesz to zrobić? Oczyść sobie z tego pola elementy tablicy $ostateczna
4) Usuwanie pola dolacz gdzieś wewnątrz foreach($element->dolacz AS $used) jest niemożliwe. Może dojść do usunięcia tego pola z elementów, które powinny być przetwarzane.
Go to the top of the page
+Quote Post
thoriam
post
Post #5





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 23.02.2012

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


dzięki thek co prawda nie wykorzystałem twojego kodu ale dzięki temu wpadłem na pomysł który mój problem rozwiązał dzięki serdeczne
Go to the top of the page
+Quote Post
thek
post
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Przecież nie pisałem, że to jest jedyne rozwiązanie (IMG:style_emoticons/default/smile.gif) Wyraźnie wspomnialem że tak może wyglądać implementacja, ale jest ona zależna od tego jakie przyjmiesz pewne założenia. Bardziej mi zależało byś dostał kawałek kodu, który wskazuje jak można to rozwiązać i stąd przy większości linijek są komentarze, by widzieć co w danej chwili się dzieje. Zapewne Twój kod korzysta z nieco zmienionych założeń. A nieco inne potrafią ten kod kompletnie poprzewracać (IMG:style_emoticons/default/smile.gif) Cieszę się, że pomogłem w zrozumieniu istoty problemu owym przykładem. Owocnej dalszej pracy życzę.
Go to the top of the page
+Quote Post
Uriziel01
post
Post #7





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

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


Cytat(thek @ 24.02.2012, 12:45:38 ) *
Przecież nie pisałem, że to jest jedyne rozwiązanie (IMG:style_emoticons/default/smile.gif) Wyraźnie wspomnialem że tak może wyglądać implementacja, ale jest ona zależna od tego jakie przyjmiesz pewne założenia. Bardziej mi zależało byś dostał kawałek kodu, który wskazuje jak można to rozwiązać i stąd przy większości linijek są komentarze, by widzieć co w danej chwili się dzieje. Zapewne Twój kod korzysta z nieco zmienionych założeń. A nieco inne potrafią ten kod kompletnie poprzewracać (IMG:style_emoticons/default/smile.gif) Cieszę się, że pomogłem w zrozumieniu istoty problemu owym przykładem. Owocnej dalszej pracy życzę.



Zważając na poziom Twojej odpowiedzi oraz kodu (Swoja drogą kiedyś także udzieliłeś mi odpowiedzi w podobnym tonie)... powinni ci za to płacić ! Seriously, nie miałem jeszcze (a raczej miałem jedynie kilkukrotnie) do czynienia z tak świetnym supportem na forum (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
thoriam
post
Post #8





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 23.02.2012

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


zgadzam się całkowicie z Urizielem. Nikt na innych forach nigdy nie opisywał tak dokładnie danego problemu, a także nie dawał tyle kodu za darmo. Teraz wiem gdzie mogę się zwrócić jak znowu będę miał kłopot (IMG:style_emoticons/default/wink.gif) . A twoje rozwiązanie pasowało idealnie, ale udało mi się znaleźć prostsze, ale tylko dlatego że zerknąłem w inną część kodu. Jeszcze raz dzięki serdeczne. Zwłaszcza, że z tym problemem gryzłem się przez ładnych parę dni (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: 15.09.2025 - 19:24