Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Synchronizacja tablic. Identyczne klucze w każdej z tablic?
kukix
post
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:
  1. $dane[0] = array (
  2. 'nazwa_1' => 'wartosc_1',
  3. 'nazwa_4' => 'wartosc_4'
  4. );
  5.  
  6. $dane[1] = array (
  7. 'nazwa_1' => 'wartosc_1a',
  8. 'nazwa_2' => 'wartosc_2a',
  9. 'nazwa_3' => 'wartosc_3a',
  10. 'nazwa_4' => 'wartosc_4a'
  11. 'nazwa_5' => 'wartosc_5a',
  12. 'nazwa_6' => 'wartosc_6a'
  13. );
  14.  
  15. $dane[2] = array (
  16. 'nazwa_2' => 'wartosc_2b',
  17. 'nazwa_3' => 'wartosc_3b',
  18. 'nazwa_4' => 'wartosc_4b'
  19. );
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




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
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: 10.10.2025 - 14:48