Funksjoner for arbeid med arrays. Settteori - PHP: Arrays - Hexlet Php skjæringspunktet mellom arrays etter verdi

Settteori. Jeg vet hvor mange som er redde for matematikere, men spesifikt settteori (naiv) er veldig enkel og forståelig. Dessuten bruker vi konstant elementene i hverdagen. Og i programmering skjer det ved hvert trinn.

Det grunnleggende konseptet for settteori er overraskende nok en haug med. Et sett betegner en samling av objekter av vilkårlig natur, betraktet som en enkelt helhet. Det enkleste eksemplet er tall. Settet med arabiske tall inkluderer 10 elementer og er endelig. Begrepet endelighet er intuitivt og betyr at et sett har et begrenset antall elementer.

Et eksempel på en uendelig mengde er naturlige tall. I sin tur er settet med naturlige tall en delmengde av heltall, som igjen er en delmengde av rasjonelle tall, og så videre.

"Subset" betyr at alle elementene i ett sett også er inkludert i et annet sett, kalt supersett(i forhold til en delmengde).

Å representere sett med sirkler er ganske praktisk. Du kan raskt vurdere hvordan ulike sett forholder seg til hverandre.

Men matematiske objekter som tall er ikke de eneste mulige objektene av sett. Et sett kan kalles en gruppe mennesker som står ved et busstopp og venter på bussen sin, eller beboere i leiligheter i ett hus, by eller land. Enhver samling av objekter som vi ønsker å betrakte som en helhet.

Det viktigste for oss i settteori er operasjoner på dem. Disse inkluderer: tillegg, forening, kryss, forskjell, kartesisk produkt og noen andre.

Et enkelt eksempel. Når du besøker en annen persons side på Facebook, viser Facebook deg en blokkering med felles venner. Hvis vi antar at vennene dine og vennens venner er to sett, så er felles venner settet oppnådd som skjæringspunktet mellom de opprinnelige vennesettene.

Går du videre til programmering, vil du legge merke til at en matrise er veldig lik et sett, og den kan faktisk tenkes på som sådan. Hvorfor er dette så viktig? Ved å forstå prinsippene bak visse operasjoner, kan du implementere dem på den raskeste og mest effektive måten. For eksempel, når du vet at du trenger en angitt skjæringsoperasjon i php, kan du prøve å finne en funksjon som gjør oppgaven. For å gjøre dette, skriv bare inn søket i Google: php sett krysser(sett - sett, skjæring - skjæring). Den første (i hvert fall for meg) lenken i søkeresultatene fører til ønsket array_intersect-funksjon. Det samme venter deg med andre operasjoner. Dette er et delvis svar på spørsmålet "trenger programmerere matematikk?"

Forresten, ikke alle språk har innebygde funksjoner for å jobbe med sett. I noen må du installere ekstra biblioteker for dette, og i noen, for eksempel i Ruby, implementeres operasjoner med sett ved å bruke aritmetiske operatorer (sammenslutning av sett: coll1 + coll2).

Hver for seg er det verdt å si at relasjonsdatabaser er bygget på ideene om relasjonell algebra, hvor settteori spiller en sentral rolle. Databaser er en integrert del av webutvikling, og vi vil bli kjent med dem senere.

La oss se på de grunnleggende operasjonene:

Kryss

Skjæringspunktet mellom sett er et sett som inkluderer elementer som vises i alle gitte sett samtidig.

["vasya", "petya"]

Denne funksjonen godtar et hvilket som helst antall arrays. Det vil si at du kan finne skjæringspunktet mellom et hvilket som helst antall arrays i en samtale.

En forening

En forening av sett er et sett som inneholder elementer av alle gitte sett. Sett union i PHP kan ikke gjøres med ett kall, men det kan simuleres ved å koble sammen to funksjoner:

["vasya", "kolya", "petya", "igor", "petya", "sergey", "vasya", "sasha"]; // unik fjerner duplikater $sharedFriends = array_unique($friends); // => ["vasya", "kolya", "petya", "igor", "sergey", "sasha"]

Tillegg (forskjell)

Forskjellen på to sett er et sett som inkluderer elementer fra det første settet som ikke er inkludert i det andre. I programmering kalles denne operasjonen ofte diff.

["kolya"]

Tilhørighet til mengden

Du kan sjekke om et element tilhører et sett ved å bruke funksjonen in_array:

Oppgave
Det er to matriser, og du vil finne deres forening (alle elementer, men hvis et element er i begge matriser, telles det én gang), skjæringspunkt (elementer i begge matriser) eller forskjell (elementer i en matrise som ikke er i den andre).

Løsning
For å definere en fagforening:
$union = array_unique(array_merge($a, $b));

For å beregne skjæringspunktet:
$kryss = array_skjæringspunkt($a, $b);

For å finne en enkel forskjell:
$difference = array_diff($a, $b);

Og for å få den symmetriske forskjellen (eksklusiv ELLER):

Diskusjon
Mange av komponentene som kreves for slike beregninger er innebygd i PHP; du trenger bare å kombinere dem i riktig rekkefølge.

Når en union oppnås fra to arrays, opprettes en gigantisk array med alle verdiene til de originale arrayene. Men array_merge()-funksjonen tillater dupliserte verdier når du slår sammen to numeriske arrays, så du må kalle array_unique()-funksjonen.
å filtrere ut slike elementer.

Dette kan imidlertid resultere i hull fordi array_unique()-funksjonen ikke komprimerer arrayen. Dette er imidlertid ikke et problem fordi både foreach-setningen og each()-funksjonen håndterer tynt befolkede arrays uten forstyrrelser.

Funksjonen for å beregne kryss er ganske enkelt kalt array_intersection() og krever ingen ekstra innsats.

Array_diff()-funksjonen returnerer en matrise som inneholder alle de unike elementene i $old matrisen som ikke er i $new matrisen. Dette kalles en enkel forskjell:


$difference = array_diff($old, $new);
Array
=> ikke
=> til
)

Den resulterende $difference-matrisen inneholder "not" og "to" fordi array_diff() skiller mellom store og små bokstaver. Det inkluderer ikke "whatever"-elementet fordi det ikke er i $old matrisen.

For å få den inverse forskjellen, eller med andre ord, for å finne de unike elementene i $new matrisen som mangler i $old matrisen, må du bytte argumentene:
$old = array("Til", "være", "eller", "ikke", "til", "være");
$new = array("Til", "være", "eller", "hva som helst");
$reverse_diff = array_diff($ny, $gammel);
Array
=> uansett
)

$reverse_diff-matrisen inneholder bare "whatever"-elementet.

Hvis du trenger å bruke en funksjon eller et annet filter i array_diff() funksjonen, bygg inn din egen differanse (subtraksjon) algoritme:

// bruk en subtraksjonsalgoritme uten store og små bokstaver; forskjell -i
$sett = array();
foreach ($new som $n) (
$sett++;
}
foreach ($old as $o) (
$o = strtolower($o);
if (!$sett[$o]) ( $diff[$o] = $o; )
}

Den første foreach-setningen oppretter en assosiativ matrise for videre søk.

Deretter går den gjennom $old matrisen, og hvis elementet ikke blir funnet under søket, legges det til $diff-matrisen.

Denne prosessen kan fremskyndes ved å kombinere array_diff() og array_map() funksjoner:

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

Den symmetriske forskjellen er hva som er i $a, men ikke i $b, pluss hva som er i $b, men ikke i $a:

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

Når den er etablert, beveger algoritmen seg fremover. Funksjonen array_diff() kalles to ganger og bestemmer to forskjeller. De kombineres deretter til en matrise. Det er ikke nødvendig å kalle array_unique() siden disse arrayene ble spesielt designet for å ikke ha noen felles elementer.

Disse funksjonene lar deg manipulere matriser på en rekke måter. Matriser er ideelle for lagring, modifisering og arbeid med sett med variabler.

Enkelt- og flerdimensjonale arrays støttes, både opprettet av brukeren og returnert som et resultat av en eller annen funksjon. Det er spesielle funksjoner for arbeid med databaser som gjør det lettere å arbeide med arrays av data som returneres som et resultat av å utføre spørringer; Det er også funksjoner som returnerer matriser som resultater.

For å lære mer om hvordan arrays opprettes og brukes i PHP, se Arrays-kapittelet i denne opplæringen.

Installasjon

Det kreves ingen installasjon for å bruke disse funksjonene da de er en del av PHP-kjernen.

Forhåndsdefinerte konstanter

Konstantene oppført nedenfor er alltid tilgjengelige som en del av PHP-kjernen.

CASE_LOWER(heltall)

CASE_LOWER brukes med funksjon array_change_key_case() for å indikere om matrisenøkler skal konverteres til små bokstaver. Standard funksjon array_change_key_case() Denne konstanten brukes.

CASE_UPPER(heltall)

CASE_UPPER brukes med funksjon array_change_key_case() for å indikere om matrisenøkler skal konverteres til store tegn.

array_change_key_case -- Returner en matrise hvis tegnnøkler er konvertert til store eller små bokstaver array_chunk -- Del opp en matrise i biter array_combine -- Lag en ny matrise ved å bruke en matrise som nøkler og en annen som de tilsvarende verdiene array_count_values ​​- - Tell antallet av alle verdier array_diff_assoc - Beregn matrisedivergens med ekstra indekskontroll array_diff_key - Beregn matrisedivergens ved å sammenligne nøkler array_diff_uassoc - Beregn matrisedivergens med ytterligere indekskontroll utført ved bruk av en brukerdefinert funksjonsarray diverdiff_uassoc nøkkelsammenligning tilbakeringing array_diff -- Beregn matrisedivergens array_fill -- Fyll en matrise med en spesifikk verdi array_filter -- Bruk et filter på en matrise ved å bruke array_flip tilbakeringing -- Bytt matriseverdier array_intersect_assoc -- Beregn matrisekonvergens med ekstra indekser sjekk array_array_indeks -- Beregn array-skjæringspunktet ved å sammenligne nøkler array_intersect_uassoc -- Beregn array-skjæringspunktet med ytterligere indekskontroll utført ved hjelp av brukerdefinert funksjon array_intersect_ukey -- Beregn array-skjæringspunktet ved å bruke nøkkelsammenligning tilbakeringing array_intersect -- Beregn array-konvergensen_eks-nøkkelen arrayen eller indeksen. er tilstede i matrisen array_keys -- Velg alle nøkler i matrisen array_map -- Bruk en tilbakeringingsfunksjon på alle elementene i de spesifiserte matrisene array_merge_recursive -- Rekursivt flette sammen to eller flere matriser array_merge -- Merge to eller flere matriser array_multisort -- Sorter multiple_multisort -- Sorter flere matriser arrays eller flerdimensjonale arrays array_pad -- Øk størrelsen på en array til en gitt verdi array_pop -- Hent det siste elementet i et array array_product -- Beregn produktet av matriseverdier array_push -- Legg til ett eller flere elementer til slutten av en array array_rand -- Velg en eller flere tilfeldige verdier fra array_reduce -- Reduser iterativt en matrise til en enkelt verdi ved å bruke tilbakeringingsfunksjonen array_reverse -- Returnerer en matrise med elementer i omvendt rekkefølge array_search -- Søker i matrisen etter en gitt verdi og returnerer den tilsvarende nøkkelen hvis vellykket array_shift -- Hent det første elementet i array array_slice -- - Velg en del av en array array_splice -- Fjern en sekvens av array-elementer og erstatt den med en annen sekvens array_sum -- Beregn summen av matriseverdier ​​array_udiff_assoc -- Beregn divergens i matriser med ekstra indekskontroll ved å bruke tilbakeringingsfunksjonen array_udiff_uassoc for å sammenligne verdier -- Beregn divergens i matriser med ekstra indekskontroll ved å bruke array_udiff tilbakeringingsfunksjonen for å sammenligne verdier og indekser -- Beregn array-divergens ved å bruke array_uintersect_assoc tilbakeringingsfunksjonen for sammenligning -- Beregn array-skjæringspunkt med ekstra indekskontroll, bruk array_uintersect_uassoc tilbakeringingsfunksjonen for å sammenligne verdier -- Beregn array-skjæringspunkt med ytterligere indekskontroll ved å bruke array_uintersect-callback og - Beregn skjæringspunktet mellom arrays ved å bruke array_unique callback for å sammenligne verdier -- Fjern dupliserte verdier fra en array array_unshift -- Legg til ett eller flere elementer i begynnelsen av array array_values ​​-- Velg alle verdier av an array array_walk_recursive -- Rekursivt bruk en tilpasset funksjon på hvert element i array_walk -- Bruk en egendefinert funksjon på hvert medlem av array array -- Lag en array arsort -- Sorter matrisen i omvendt rekkefølge, og bevar tastene asort - - Sorter matrisen, bevar nøklene kompakte - Lag en matrise som inneholder variabelnavn og deres verdier