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
thek
post
Post #2





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

Posty w temacie


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.10.2025 - 07:20