Funcții pentru lucrul cu matrice. Teoria seturilor - PHP: Arrays - Intersecția Hexlet Php a tablourilor după valoare

Teoria multimilor. Știu câți oameni se tem de matematicieni, dar teoria seturilor (naivă) este foarte simplă și de înțeles. Mai mult, folosim constant elementele sale în viața de zi cu zi. Și în programare se întâmplă la fiecare pas.

Conceptul de bază al teoriei mulțimilor, în mod surprinzător, este o multime de. O mulțime denotă o colecție de obiecte de natură arbitrară, considerate ca un singur întreg. Cel mai simplu exemplu sunt numerele. Setul de cifre arabe include 10 elemente și este final. Conceptul de finitate este intuitiv și înseamnă că o mulțime are un număr finit de elemente.

Un exemplu de mulțime infinită sunt numerele naturale. La rândul său, mulțimea numerelor naturale este o submulțime de numere întregi, care la rândul lor sunt o submulțime de numere raționale și așa mai departe.

„Subset” înseamnă că toate elementele unui set sunt incluse și într-un alt set, numit superset(relativ la un subset).

Reprezentarea seturilor prin cercuri este destul de convenabilă. Puteți evalua rapid modul în care diferitele seturi se relaționează între ele.

Dar obiectele matematice precum numerele nu sunt singurele obiecte posibile ale mulțimilor. Un set poate fi numit un grup de oameni care stau la o stație de autobuz și își așteaptă autobuzul sau rezidenți ai apartamentelor dintr-o casă, oraș sau țară. Orice colecție de orice obiecte pe care dorim să le considerăm ca un întreg.

Principalul lucru pentru noi în teoria mulțimilor este operațiile asupra lor. Acestea includ: adunarea, unirea, intersecția, diferența, produsul cartezian și altele.

Un exemplu simplu. Când vizitezi pagina unei alte persoane pe Facebook, Facebook îți arată un bloc cu prietenii comuni. Dacă presupunem că prietenii tăi și prietenii prietenului tău sunt două seturi, atunci prietenii comuni sunt setul obținut ca intersecție a seturilor originale de prieteni.

Trecând la programare, veți observa că o matrice este foarte asemănătoare cu un set și poate fi într-adevăr gândită ca atare. De ce este asta atât de important? Înțelegând principiile din spatele anumitor operațiuni, le puteți implementa în cel mai rapid și eficient mod. De exemplu, știind că aveți nevoie de o operație de intersecție setată în php, puteți încerca să găsiți o funcție care face sarcina. Pentru a face acest lucru, trebuie doar să introduceți interogarea în Google: php set intersect(mulțime - mulțime, intersectare - intersecție). Primul link (cel puțin pentru mine) din rezultatele căutării duce la funcția dorită array_intersect. Același lucru vă așteaptă și cu alte operațiuni. Acesta este un răspuns parțial la întrebarea „au programatorii au nevoie de matematică?”

Apropo, nu toate limbile au funcții încorporate pentru lucrul cu seturi. În unele, trebuie să instalați biblioteci suplimentare pentru aceasta, iar în unele, de exemplu, în Ruby, operațiunile cu seturi sunt implementate folosind operatori aritmetici (uniunea seturilor: coll1 + coll2).

Separat, merită spus că bazele de date relaționale sunt construite pe ideile algebrei relaționale, în care teoria mulțimilor joacă un rol central. Bazele de date sunt o parte integrantă a dezvoltării web și le vom cunoaște mai târziu.

Să ne uităm la operațiunile de bază:

Intersecție

Intersecția mulțimilor este o mulțime care include elemente care apar în toate mulțimile date în același timp.

[„vasya”, „petya”]

Această funcție acceptă orice număr de matrice. Adică, puteți găsi intersecția oricărui număr de matrice într-un singur apel.

O asociere

O uniune de mulțimi este o mulțime care conține elemente ale tuturor mulțimilor date. Unirea setată în PHP nu se poate face cu un singur apel, dar poate fi simulată prin conectarea a două funcții:

[„vasya”, „kolya”, „petya”, „igor”, „petya”, „sergey”, „vasya”, „sasha”]; // unic elimină duplicatele $sharedFriends = array_unique($prieteni); // => ["vasya", "kolya", "petya", "igor", "sergey", "sasha"]

Adăugare (diferență)

Diferența a două seturi este un set care include elemente ale primului set care nu sunt incluse în al doilea. În programare, această operație este adesea numită dif.

[„kolya”]

Aparținând mulțimii

Puteți verifica dacă un element aparține unui set folosind funcția in_array:

Sarcină
Există două matrice și doriți să găsiți uniunea lor (toate elementele, dar dacă un element este în ambele matrice, este numărat o dată), intersecția (elementele din ambele matrice) sau diferența (elementele dintr-o matrice care nu sunt în celălalt).

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

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

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

Și pentru a obține diferența simetrică (SAU exclusiv):

Discuţie
Multe dintre componentele necesare pentru astfel de calcule sunt încorporate în PHP; trebuie doar să le combinați în secvența corespunzătoare.

Când se obține o unire din două matrice, se creează o matrice gigantică cu toate valorile matricelor originale. Dar funcția array_merge() permite valori duplicate atunci când îmbinați două matrice numerice, așa că trebuie să apelați funcția array_unique().
pentru a filtra astfel de elemente.

Totuși, acest lucru poate duce la lacune deoarece funcția array_unique() nu compactează matricea. Totuși, aceasta nu este o problemă deoarece atât instrucțiunea foreach, cât și funcția each() gestionează matrice slab populate fără interferențe.

Funcția de calculare a intersecției se numește pur și simplu array_intersection() și nu necesită niciun efort suplimentar.

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


$diferență = array_diff($vechi, $nou);
Matrice
=> nu
=> la
)

Matricea $difference rezultată conține „not” și „to” deoarece array_diff() face distincție între majuscule și minuscule. Nu include elementul „orice” deoarece nu se află în matricea $old.

Pentru a obține diferența inversă sau, cu alte cuvinte, pentru a găsi elementele unice ale matricei $nou care lipsesc în matricea $vechi, trebuie să schimbați argumentele:
$vechi = array(„Ca”, „fi”, „sau”, „nu”, „către”, „fi”);
$nou = matrice(„Către”, „fi”, „sau”, „oricare”);
$reverse_diff = array_diff($nou, $vechi);
Matrice
=> orice
)

Tabloul $reverse_diff conține doar elementul „orice”.

Dacă trebuie să aplicați o funcție sau alt filtru în funcția array_diff(), încorporați propriul algoritm de diferență (scădere):

// aplică un algoritm de scădere care nu ține seama de majuscule; diferenta -i
$seen = array();
foreach ($nou ca $n) (
$seen++;
}
foreach ($vechi ca $o) (
$o = strtolower($o);
dacă (!$văzut[$o]) ( $dif[$o] = $o; )
}

Prima instrucțiune foreach creează o matrice asociativă pentru căutări ulterioare.

Apoi trece prin matricea $old și, dacă elementul nu este găsit în timpul căutării, este adăugat la matricea $diff.

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

$diff = array_diff(array_map("strtolower", $old),
array_map("strtolower", $nou));

Diferența simetrică este ceea ce este în $a, dar nu în $b, plus ceea ce este în $b, dar nu în $a:

$diferență = array_merge(array_diff($a, $b), array_diff($b, $a));

Odată stabilit, algoritmul avansează. Funcția array_diff() este numită de două ori și determină două diferențe. Ele sunt apoi combinate într-o singură matrice. Nu este nevoie să apelați array_unique() deoarece aceste matrice au fost concepute special pentru a nu avea elemente comune.

Aceste funcții vă permit să manipulați matrice într-o varietate de moduri. Matricele sunt ideale pentru stocarea, modificarea și lucrul cu seturi de variabile.

Sunt acceptate matricele unice și multidimensionale, atât create de utilizator, cât și returnate ca rezultat de o anumită funcție. Există funcții speciale pentru lucrul cu baze de date care facilitează lucrul cu matrice de date returnate ca urmare a executării interogărilor; Există, de asemenea, funcții care returnează matrice ca rezultate.

Pentru a afla mai multe despre cum sunt create și utilizate matricele în PHP, consultați capitolul Arrays din acest tutorial.

Instalare

Nu este necesară nicio instalare pentru a utiliza aceste caracteristici, deoarece fac parte din nucleul PHP.

Constante predefinite

Constantele enumerate mai jos sunt întotdeauna disponibile ca parte a nucleului PHP.

CASE_LOWER(întreg)

CASE_LOWER folosit cu funcția array_change_key_case() pentru a indica dacă cheile matricei trebuie convertite în caractere mici. Funcție implicită array_change_key_case() Această constantă este folosită.

CASE_SUPER(întreg)

CASE_SUPER folosit cu funcția array_change_key_case() pentru a indica dacă cheile matricei trebuie convertite în caractere majuscule.

array_change_key_case -- Returnează o matrice ale cărei chei de caractere sunt convertite în caractere majuscule sau mici array_chunk -- Împărțiți o matrice în bucăți array_combine -- Creați o matrice nouă folosind o matrice ca chei și alta ca valori corespunzătoare array_count_values ​​- - Numărați numărul tuturor valorilor array_diff_assoc -- Calculați divergența matricei cu verificarea suplimentară a indexului array_diff_key -- Calculați divergența matricei prin compararea cheilor array_diff_uassoc -- Calculați divergența matricei cu verificarea suplimentară a indexului efectuată utilizând o funcție definită de utilizator array_ukey diverce --diverce_ukey comparație cheie callback array_diff -- Calculați divergența matricei array_fill -- Umpleți o matrice cu o anumită valoare array_filter -- Aplicați un filtru unei matrice utilizând callback-ul array_flip -- Schimbați valorile matricei array_intersect_assoc -- Calculați convergența matricei cu controlul suplimentar al indexului_key_ -- Calculați intersecția matricei prin compararea cheilor array_intersect_uassoc -- Calculați intersecția matricei cu verificarea suplimentară a indexului efectuată utilizând funcția definită de utilizator array_intersect_ukey -- Calculați intersecția matricei utilizând apelul invers pentru compararea cheilor array_intersect -- Calculați convergența matricei array_key_exists sau indexați -- Verificați dacă cheia specificată este prezent în matricea array_keys -- Selectați toate cheile din matricea array_map -- Aplicați o funcție de apel invers tuturor elementelor matricelor specificate array_merge_recursive -- Îmbinați recursiv două sau mai multe matrice array_merge -- Îmbinați două sau mai multe matrice array_multisort -- Sortare multiple matrice sau matrice multidimensionale array_pad -- Mărește dimensiunea unei matrice la o valoare dată array_pop -- Preluați ultimul element al unei matrice array_product -- Calculați produsul valorilor matricei array_push -- Adăugați unul sau mai multe elemente la sfârșitul o matrice array_rand -- Selectați una sau mai multe valori aleatoare din array_reduce -- Reduceți iterativ o matrice la o singură valoare folosind funcția de apel invers array_reverse -- Returnează o matrice cu elemente în ordine inversă array_search -- Caută în matrice o anumită valoare și returnează cheia corespunzătoare dacă are succes array_shift -- Preluați primul element al matricei array_slice -- Selectați o porțiune dintr-o matrice array_splice -- Eliminați o secvență de elemente de matrice și înlocuiți-o cu o altă secvență array_sum -- Calculați suma valorilor matricei ​​array_udiff_assoc -- Calculați divergența în tablouri cu verificare suplimentară a indexului, folosind funcția de apel invers array_udiff_uassoc pentru a compara valori -- Calculați divergența în tablouri cu verificare suplimentară a indexului, folosind funcția de apel invers array_udiff pentru a compara valori și indici -- Calculați divergența matricei folosind funcția de apel invers array_uintersect_assoc pentru comparație -- Calculați intersecția matricei cu verificarea suplimentară a indexului, folosind funcția de apel invers array_uintersect_uassoc pentru a compara valori -- Calculați intersecția matricei cu verificarea suplimentară a indexului folosind apelarea array_uintersect pentru a compara indici și valori - Calculați intersecția matricelor folosind callback-ul array_unique pentru a compara valori -- Eliminați valorile duplicate dintr-o matrice array_unshift -- Adăugați unul sau mai multe elemente la începutul matricei array_values ​​​​-- Selectați toate valorile an array array_walk_recursive -- Aplică recursiv o funcție personalizată fiecărui element al matricei array_walk -- Aplică o funcție personalizată fiecărui element al matricei -- Creați o matrice arsort -- Sortați matricea în ordine inversă, păstrând cheile asortate - - Sortați matricea, păstrând cheile compacte -- Creați o matrice care să conțină numele variabilelor și valorile acestora