Funkcije za rad sa nizovima. Teorija skupova - PHP: Nizovi - Hexlet Php presek nizova po vrednosti

Teorija skupova. Znam koliko se ljudi plaši matematičara, ali konkretno teorija skupova (naivna) je vrlo jednostavna i razumljiva. Štaviše, njegove elemente stalno koristimo u svakodnevnom životu. A u programiranju se to dešava na svakom koraku.

Osnovni koncept teorije skupova, iznenađujuće, jeste gomila. Skup označava skup objekata proizvoljne prirode, koji se smatraju jedinstvenom cjelinom. Najjednostavniji primjer su brojevi. Skup arapskih brojeva uključuje 10 elemenata i jeste final. Koncept konačnosti je intuitivan i znači da skup ima konačan broj elemenata.

Primjer beskonačnog skupa su prirodni brojevi. Zauzvrat, skup prirodnih brojeva je podskup cijelih brojeva, koji su zauzvrat podskup racionalnih brojeva, i tako dalje.

"Podskup" znači da su svi elementi jednog skupa također uključeni u drugi skup, tzv superset(u odnosu na podskup).

Predstavljanje skupova krugovima je prilično zgodno. Možete brzo procijeniti kako su različiti skupovi međusobno povezani.

Ali matematički objekti kao što su brojevi nisu jedini mogući objekti skupova. Skupom se može nazvati grupa ljudi koji stoje na autobuskoj stanici i čekaju svoj autobus, ili stanari stanova u jednoj kući, gradu ili državi. Bilo koja kolekcija bilo kojih objekata koje želimo da posmatramo kao jedinstvenu celinu.

Glavna stvar za nas u teoriji skupova su operacije na njima. To uključuje: sabiranje, uniju, presek, razliku, kartezijanski proizvod i neke druge.

Jednostavan primjer. Kada posjetite stranicu druge osobe na Facebooku, Facebook vam prikazuje blok sa zajedničkim prijateljima. Ako pretpostavimo da su vaši prijatelji i prijatelji vašeg prijatelja dva skupa, tada su zajednički prijatelji skup dobijen kao presek originalnih skupova prijatelja.

Prelazeći na programiranje, primijetit ćete da je niz vrlo sličan skupu i da se zaista može smatrati takvim. Zašto je ovo toliko važno? Razumijevanjem principa koji stoje iza određenih operacija, možete ih implementirati na najbrži i najefikasniji način. Na primjer, znajući da vam je potrebna operacija ukrštanja skupa u php-u, možete pokušati pronaći funkciju koja obavlja zadatak. Da biste to učinili, samo unesite upit u Google: php skup se preseca(set - skup, presek - presek). Prvi (barem za mene) link u rezultatima pretrage vodi do željene funkcije array_intersect. Ista stvar vas čeka i sa ostalim operacijama. Ovo je delimičan odgovor na pitanje „da li je programerima potrebna matematika?“

Usput, nemaju svi jezici ugrađene funkcije za rad sa skupovima. U nekima je za to potrebno instalirati dodatne biblioteke, au nekima, na primjer, u Rubyju, operacije sa skupovima se implementiraju pomoću aritmetičkih operatora (unija skupova: coll1 + coll2).

Odvojeno, vrijedi reći da su relacijske baze podataka izgrađene na idejama relacijske algebre, u kojoj teorija skupova igra centralnu ulogu. Baze podataka su sastavni dio web razvoja, a kasnije ćemo ih upoznati.

Pogledajmo osnovne operacije:

Raskrsnica

Presjek skupova je skup koji uključuje elemente koji se pojavljuju u svim datim skupovima u isto vrijeme.

["vasya", "petya"]

Ova funkcija prihvaća bilo koji broj nizova. To jest, možete pronaći presjek bilo kojeg broja nizova u jednom pozivu.

Udruženje

Unija skupova je skup koji sadrži elemente svih datih skupova. Set union u PHP-u se ne može obaviti jednim pozivom, ali se može simulirati povezivanjem dvije funkcije:

["vasya", "kolya", "petya", "igor", "petya", "sergey", "vasya", "sasha"]; // jedinstveni uklanja duplikate $sharedFriends = array_unique($friends); // => ["vasya", "kolya", "petya", "igor", "sergey", "sasha"]

zbrajanje (razlika)

Razlika između dva skupa je skup koji uključuje elemente prvog skupa koji nisu uključeni u drugi. U programiranju se ova operacija često naziva diff.

["kolya"]

Pripadanje mnoštvu

Možete provjeriti pripada li element skupu pomoću funkcije in_array:

Zadatak
Postoje dva niza i želite da pronađete njihovu uniju (svi elementi, ali ako je element u oba niza, računa se jednom), presek (elementi u oba niza) ili razliku (elementi u jednom nizu koji nisu u drugi).

Rješenje
Za definiranje sindikata:
$union = array_unique(array_merge($a, $b));

Za izračunavanje raskrsnice:
$intersection = array_intersection($a, $b);

Da biste pronašli jednostavnu razliku:
$razlika = array_diff($a, $b);

I da dobijete simetričnu razliku (isključivo ILI):

Diskusija
Mnoge komponente koje su potrebne za takve proračune ugrađene su u PHP; samo ih trebate kombinovati u odgovarajućem redoslijedu.

Kada se dobije unija iz dva niza, kreira se jedan divovski niz sa svim vrijednostima originalnih nizova. Ali funkcija array_merge() dozvoljava duple vrijednosti prilikom spajanja dva numerička niza, tako da morate pozvati funkciju array_unique().
da filtrira takve elemente.

Međutim, to može rezultirati prazninama jer funkcija array_unique() ne sažima niz. Međutim, to nije problem jer i foreach izraz i funkcija every() rukuju rijetko naseljenim nizovima bez smetnji.

Funkcija za izračunavanje raskrsnice jednostavno se zove array_intersection() i ne zahtijeva nikakav dodatni napor.

Funkcija array_diff() vraća niz koji sadrži sve jedinstvene elemente starog niza $starog niza koji se ne nalaze u $new nizu. Ovo se zove jednostavna razlika:


$razlika = array_diff($stari, $novi);
Niz
=> ne
=> do
)

Rezultirajući niz $difference sadrži "not" i "to" jer je array_diff() osjetljiv na velika i mala slova. Ne uključuje element "whatever" jer se ne nalazi u nizu $old.

Da biste dobili inverznu razliku, ili, drugim riječima, da biste pronašli jedinstvene elemente $new niza koji nedostaju u $starom nizu, trebate zamijeniti argumente:
$old = array("Za", "biti", "ili", "ne", "za", "biti");
$new = array("Za", "biti", "ili", "šta god");
$reverse_diff = array_diff($novo, $staro);
Niz
=> kako god
)

Niz $reverse_diff sadrži samo element "whatever".

Ako trebate primijeniti funkciju ili drugi filter u funkciju array_diff(), ugradite vlastiti algoritam razlike (oduzimanja):

// primjenjuje algoritam oduzimanja bez obzira na velika i mala slova; razlika -i
$seen = niz();
foreach ($novo kao $n) (
$seen++;
}
foreach ($star kao $o) (
$o = strtolower($o);
if (!$seen[$o]) ( $diff[$o] = $o; )
}

Prvi foreach izraz kreira asocijativni niz za dalje pretraživanje.

Zatim petlja kroz $old niz i, ako se element ne pronađe tokom pretrage, dodaje se u niz $diff.

Ovaj proces se može ubrzati kombinacijom funkcija array_diff() i array_map():

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

Simetrična razlika je ono što je u $a, ali ne u $b, plus ono što je u $b, ali ne u $a:

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

Kada se uspostavi, algoritam se kreće naprijed. Funkcija array_diff() se poziva dvaput i određuje dvije razlike. Zatim se kombinuju u jedan niz. Nema potrebe pozvati array_unique() jer su ovi nizovi posebno dizajnirani da nemaju zajedničke elemente.

Ove funkcije vam omogućavaju da manipulišete nizovima na različite načine. Nizovi su idealni za skladištenje, modifikovanje i rad sa skupovima varijabli.

Podržani su jednodimenzionalni i višedimenzionalni nizovi, oboje kreirani od strane korisnika i vraćeni kao rezultat neke funkcije. Postoje posebne funkcije za rad sa bazama podataka koje olakšavaju rad sa nizovima podataka vraćenih kao rezultat izvršavanja upita; Postoje i funkcije koje vraćaju nizove kao rezultate.

Da biste saznali više o tome kako se nizovi kreiraju i koriste u PHP-u, pogledajte poglavlje Nizovi u ovom vodiču.

Instalacija

Za korištenje ovih funkcija nije potrebna instalacija jer su dio PHP jezgra.

Predefinisane konstante

Dolje navedene konstante su uvijek dostupne kao dio PHP jezgra.

CASE_LOWER(cijeli broj)

CASE_LOWER koristi se sa funkcijom array_change_key_case() da bi se naznačilo da li ključevi niza treba da se konvertuju u mala slova. Zadana funkcija array_change_key_case() Ova konstanta se koristi.

CASE_UPPER(cijeli broj)

CASE_UPPER koristi se sa funkcijom array_change_key_case() da bi se naznačilo da li ključevi niza treba da se konvertuju u velika slova.

array_change_key_case -- Vraća niz čiji se ključevi znakova pretvaraju u velika ili mala slova znakova array_chunk -- Podijelite niz na komade array_combine -- Kreirajte novi niz koristeći jedan niz kao ključeve i drugi kao odgovarajuće vrijednosti array_count_values ​​- - Izračunajte broj svih vrijednosti array_diff_assoc -- Izračunajte divergenciju niza sa dodatnom provjerom indeksa array_diff_key -- Izračunajte divergenciju niza upoređivanjem ključeva array_diff_uassoc -- Izračunajte divergenciju niza s dodatnom provjerom indeksa koja se izvodi korištenjem korisnički definirane funkcije array_diffukeyarray -- Computed array divergence Povratni poziv za poređenje ključeva array_diff -- Izračunajte divergenciju niza array_fill -- Popunite niz sa određenom vrijednošću array_filter -- Primijenite filter na niz koristeći povratni poziv array_flip -- Zamijenite vrijednosti niza array_intersect_assoc -- Izračunajte konvergenciju niza sa dodatnom provjerom indeksa array_intersect_ -- Izračunajte raskrsnicu niza upoređivanjem ključeva array_intersect_uassoc -- Izračunajte raskrsnicu niza sa dodatnom provjerom indeksa urađenom koristeći korisnički definiranu funkciju array_intersect_ukey -- Izračunajte raskrsnicu niza koristeći povratni poziv za poređenje ključeva array_intersect -- Izračunajte konvergencija niza da li je specificiran ključ konvergencije_kexists -- provjerite da li je array_intersect konvergencija naveden je prisutan u nizu array_keys -- Odaberite sve ključeve u nizu array_map -- Primijenite funkciju povratnog poziva na sve elemente specificiranih nizova array_merge_recursive -- Rekurzivno spojite dva ili više nizova array_merge -- Spojite dva ili više nizova array_multisort -- Sortirajte nizovi ili višedimenzionalni nizovi array_pad -- Povećajte veličinu niza na datu vrijednost array_pop -- Dohvatite posljednji element niza array_product -- Izračunajte proizvod vrijednosti niza array_push -- Dodajte jedan ili više elemenata na kraj niz array_rand -- Odaberite jednu ili više nasumičnih vrijednosti iz array_reduce -- Iterativno smanjite niz na jednu vrijednost pomoću funkcije povratnog poziva array_reverse -- Vraća niz sa elementima obrnutim redoslijedom array_search -- Pretražuje niz za datu vrijednost i vraća odgovarajući ključ ako je uspješan array_shift -- Dohvati prvi element niza array_slice -- Odaberi dio niza array_splice -- Ukloni niz elemenata niza i zamijeni ga drugom sekvencom array_sum -- Izračunaj zbir vrijednosti niza array_udiff_assoc -- Izračunajte divergenciju u nizovima s dodatnom provjerom indeksa, koristeći funkciju povratnog poziva array_udiff_uassoc za upoređivanje vrijednosti -- Izračunajte divergenciju u nizovima s dodatnom provjerom indeksa, koristeći funkciju povratnog poziva array_udiff za poređenje vrijednosti i indeksa -- Izračunajte divergencija niza koristeći funkciju povratnog poziva array_uintersect_assoc za poređenje -- Izračunajte presjek niza s dodatnom provjerom indeksa, koristeći funkciju povratnog poziva array_uintersect_uassoc za upoređivanje vrijednosti -- Izračunajte raskrsnicu niza s dodatnom provjerom indeksa koristeći povratni poziv array_uintersect i vrijednosti za poređenje- u - Izračunajte sjecište nizova koristeći povratni poziv array_unique da uporedite vrijednosti -- Uklonite duple vrijednosti iz niza array_unshift -- Dodajte jedan ili više elemenata na početak niza array_values ​​-- Odaberite sve vrijednosti niz array_walk_recursive -- Rekurzivno primijeni prilagođenu funkciju na svaki element niza array_walk -- Primijenite prilagođenu funkciju na svaki element niza niza -- Kreirajte niz arsort -- Sortirajte niz obrnutim redoslijedom, čuvajući sortiranje ključeva - - Sortirajte niz, čuvajući kompaktne ključeve - Kreirajte niz koji sadrži imena varijabli i njihove vrijednosti