Determinarea uniunii, intersecției sau diferenței a două matrice

sarcină
Există două matrice, și este necesar pentru a găsi asocierea lor (toate elementele, dar în cazul în care elementul este inclus în ambele matrice, aceasta este luată în calcul o singură dată), a (elementele care aparțin ambele matrice) de intersecție sau diferența (elementele de matrice care nu sunt prezente în celălalt).







Soluția
Pentru a defini o uniune:
$ union = array_unique (array_merge ($ a, $ b));

Pentru a calcula intersecția:
$ intersecție = array_intersecție ($ a, $ b);

Pentru a găsi o diferență simplă:
$ diferență = array_diff ($ a, $ b);

Și pentru a obține o diferență simetrică (OR exclusivă):
$ diferent = array_merge (array_diff ($ a, $ b), array_diff ($ b, $ a));

discuție
Multe dintre componentele necesare pentru astfel de calcule sunt construite în PHP, trebuie doar să le combinați în ordinea corespunzătoare.

Când primiți o uniune de două matrice, se creează o matrice gigantică cu toate valorile matricelor originale. Dar funcția array_merge () rezolvă valorile duplicate atunci când combină două matrice numerice, deci trebuie să apelați funcția array_unique ()
pentru a filtra astfel de elemente.


Dar, în același timp, pot apărea omisiuni, deoarece funcția array_unique () nu condensează matricea. Cu toate acestea, aceasta nu este o problemă, deoarece atît instrucțiunea foreach, cît și funcția each () se ocupă de matrice rare pline fără interferențe.

Funcția de calcul al intersecției are un nume simplu array_intersection () și nu necesită efort suplimentar.

Funcția array_diff () returnează un tablou care conține toate elementele unice ale matricei $ vechi care nu se află în matricea nouă $. Aceasta se numește o diferență simplă:






$ old = array ('Pentru', 'be', 'sau', 'nu', 'to', 'be');
$ new = matrice ('To', 'be', 'sau', 'whatever');
$ difference = array_diff ($ vechi, $ noi);
mulțime
(
[3] => nu
[4] => la
)

Matricea de diferențe $ care rezultă conține "nu" și "to", deoarece funcția array_diff () este sensibilă la minuscule. Nu include elementul "indiferent", deoarece nu este în matricea veche $.

Pentru a obține diferența inversă sau, cu alte cuvinte, pentru a găsi elementele unice ale matricei noi $ care nu se află în vechea matrice $, trebuie să schimbați argumentele:
$ old = array ('Pentru', 'be', 'sau', 'nu', 'to', 'be');
$ new = matrice ('To', 'be', 'sau', 'whatever');
$ reverse_diff = array_diff ($ noi, $ vechi);
mulțime
(
[3] => orice
)

Matricea $ reverse_diff conține numai elementul "orice".

Dacă doriți să aplicați o funcție sau un alt filtru funcției array_diff (), construiți propriul algoritm pentru a găsi diferența (scăderea):

// aplicați un algoritm de scădere insensibil de la caz; diferență -i
$ vazut = array ();
foreach ($ noi ca $ n) $ vazut [strtolower ($ n)] ++;
>
foreach ($ vechi ca $ o) $ o = strtolower ($ o);
dacă (! $ văzut [$ o]) <$diff[$o] = $o;>
>

Prima instrucțiune foreach creează o matrice asociativă pentru căutarea ulterioară.


Apoi, o buclă este executată pe vechea matrice $, iar dacă un element nu este găsit în timpul căutării, acesta este adăugat la $ diff matrix.

Acest proces poate fi accelerat prin combinarea funcțiilor array_diff () și array_map ():

$ diff = array_diff (array_map ('strtolower', $ vechi),
array_map ('strtolower', $ new));

Diferența simetrică este aceea care aparține $ a, dar nu aparține lui $ b, plus ce este în $ b, dar nu în $ a:

$ diferent = array_merge (array_diff ($ a, $ b), array_diff ($ b, $ a));

Odată instalat, algoritmul avansează. Funcția array_diff () este apelată de două ori și definește două diferențe. Apoi sunt combinate într-o singură matrice. Nu este necesar să apelați funcția array_unique (), deoarece aceste tablouri au fost special concepute ca având elemente comune.







Trimiteți-le prietenilor: