![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 600 Pomógł: 2 Dołączył: 1.09.2002 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Witam..
Posiadam dynamicznie generowane tablice, $dane[0], $dane[1], $dane[2] itd. Ilośc tablic to od 2 do max 5, średnia ilość kluczy w tych tablicach to 10-50 kluczy. Potrzebuje zsynchronizować klucze w tych tablicach. tzn jeżeli w jednej tabeli występuje dany klucz to potrzebuje, żeby dodać go do pozostałych, które go nie posiadają, ale żeby wartość była pusta lub jakiś inny wybrany znak. Znalazłem w manualu funkcje array_diff, jednak nie mam pomysłu jak optymalnie to wykorzystać. Przykładowe tablice:
|
|
|
![]() |
![]()
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 ![]() |
Ale Tobie chodzi o klucze, a nie wartości, czyli musiałbyś użyć array_diff_key. Problem z tym, że skoro masz X tablic, to działań masz masę... Czemu? Ponieważ masz porównania wszystkich tablic między sobą. Przypuśćmy, że masz tablice A, B i C... To do tablicy A dodajesz klucze wynikające z różnic między C i A oraz C i B. Jednocześnie robisz to samo z B (C i B oraz A i B) oraz C (A i C oraz B i C). Co gorsze to muszą one w trakcie wszystkich operacji być niezmienne. To daje nam 6 operacji. Liczba ta rośnie według wzoru n!... czyli 5 tablic to 5! = 120 samych operacji array_diff_key.
A jak wyglądałby sam proces tym sposobem? Najprościej do wytłumaczenia chyba tak: 1. Wybierz tablicę. 2. Utwórz pustą. 3. Wykonaj array_diff_key innej oraz wybranej. 4. Połącz ją z tą utworzoną w punkcie 2. 5. Jeśli jest kolejna tablica - weź ją i idź do punktu 3 6. Jeśli nie ma, weź sobie wszystkie wartości tablicy z punktu 2 ustaw na takie jakie sygnalizują, że to nowy klucz 7. Dołącz tablicę bazową z punktu 1, a wynik to właśnie to jak wygląda ta tablica bazowa po zmianach. 8. Powtarzaj aż skończą Ci się tablice. Uważaj... Nie możesz działać na referencjach, gdyż po pierwszej zmianie miałbyś już zafałszowaną tablicę bazową. Dla Twojego przykładu wyglądałby proces tak: 1. Weź $dane[0] 2. Utwórz pustą $wynik[0] 3. Zrób różnice dla $dane[1] diff $dane[0] (nazwa_2, nazwa_3, nazwa_5, nazwa_6) oraz $dane[2] diff $dane[0] (nazwa_2, nazwa_3) 4. Dostajemy tablicę $wynik[0] z kluczami (nazwa_2, nazwa_3, nazwa_5, nazwa_6) i ustawiamy im jakąś wartość charakterystyczną 5. Do tej tablicy dołączamy bazową. 6. Podobnie robimy z resztą. EDIT: Niktoś, problem jest taki, że z ]array_merge trzeba uważać. Zobacz sobie jak ona się zachowuje przy kluczach numerycznych. Tu trzeba naprawdę dobrze "wyczuć". Pomysł z array_merge jest o wiele lepszy niż z array_diff_key, ale naprawdę trzeba uważać na klucze.
Powód edycji: [thek]: Uwaga mała co do kluczy przy array_merge
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 10.10.2025 - 14:48 |