Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Łączenie tablic
Forum PHP.pl > Forum > PHP
thoriam
witam wszystkich w swoim pierwszym poście 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ł
gothye
array_merge
thoriam
tak manual umiem czytać być może ta funkcja mi się przyda ale jak ją wykorzystać w moim problemie??
thek
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 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.
thoriam
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
thek
Przecież nie pisałem, że to jest jedyne rozwiązanie 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ć smile.gif Cieszę się, że pomogłem w zrozumieniu istoty problemu owym przykładem. Owocnej dalszej pracy życzę.
Uriziel01
Cytat(thek @ 24.02.2012, 12:45:38 ) *
Przecież nie pisałem, że to jest jedyne rozwiązanie 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ć 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 wink.gif
thoriam
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 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 wink.gif
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.