Funkciók a tömbökkel való munkavégzéshez. Halmazelmélet - PHP: Tömbök - Hexlet Php tömbök metszéspontja érték szerint

Halmazelmélet. Tudom, hogy sokan félnek a matematikusoktól, de a konkrét halmazelmélet (naiv) nagyon egyszerű és érthető. Sőt, elemeit folyamatosan használjuk a mindennapi életben. A programozásban pedig minden lépésnél előfordul.

A halmazelmélet alapkoncepciója meglepő módon az Egy csomó. A halmaz tetszőleges természetű objektumok gyűjteményét jelöli, amelyeket egyetlen egésznek tekintünk. A legegyszerűbb példa a számok. Az arab számok halmaza 10 elemet tartalmaz, és van végső. A végesség fogalma intuitív, és azt jelenti, hogy egy halmaznak véges számú eleme van.

A végtelen halmazra példa a természetes számok. A természetes számok halmaza viszont az egész számok részhalmaza, amelyek viszont a racionális számok részhalmazai, és így tovább.

A "részhalmaz" azt jelenti, hogy egy halmaz összes eleme egy másik halmazban is szerepel, ún szuperkészlet(egy részhalmazhoz képest).

A halmazok körökkel történő ábrázolása meglehetősen kényelmes. Gyorsan felmérheti, hogy a különböző halmazok hogyan kapcsolódnak egymáshoz.

De a matematikai objektumok, például a számok, nem az egyetlen lehetséges objektum a halmazoknak. Egy készletet nevezhetünk egy buszmegállóban álló, buszra váró embercsoportnak, vagy egy ház, város vagy ország lakásainak lakóinak. Bármely objektum gyűjteménye, amelyet egyetlen egésznek szeretnénk tekinteni.

Számunkra a halmazelméletben a legfontosabb a rajtuk végzett műveletek. Ezek közé tartozik: összeadás, egyesülés, metszéspont, különbség, derékszögű szorzat és néhány más.

Egy egyszerű példa. Amikor felkeres egy másik személy Facebook-oldalát, a Facebook megjelenít egy blokkot közös ismerőseivel. Ha feltételezzük, hogy a barátaid és a barátod barátai két halmaz, akkor a közös barátok az eredeti baráthalmazok metszéspontjaként kapott halmaz.

Továbblépve a programozásra, észre fogod venni, hogy egy tömb nagyon hasonlít egy halmazra, és valóban annak is felfogható. Miért olyan fontos ez? Az egyes műveletek mögött rejlő elvek megértésével a leggyorsabb és leghatékonyabb módon valósíthatja meg azokat. Például, ha tudja, hogy php-ban szükség van egy metszésponti műveletre, megpróbálhat olyan függvényt találni, amely elvégzi a feladatot. Ehhez csak írja be a lekérdezést a Google-ba: php set metszik(halmaz - halmaz, metszés - metszéspont). A keresési eredmények első (legalábbis számomra) linkje a kívánt array_intersect függvényhez vezet. Ugyanez vár rád más műveleteknél is. Ez egy részleges válasz arra a kérdésre, hogy „szükségük van a programozóknak matematikára?”

Mellesleg, nem minden nyelv rendelkezik beépített funkciókkal a készletekkel való munkavégzéshez. Egyes esetekben további könyvtárakat kell telepítenie ehhez, és néhányban, például a Rubyban, a halmazokkal végzett műveleteket aritmetikai operátorok segítségével hajtják végre (halmazok uniója: coll1 + coll2).

Külön érdemes elmondani, hogy a relációs adatbázisok a relációs algebra gondolataira épülnek, amelyben a halmazelmélet központi szerepet játszik. Az adatbázisok a webfejlesztés szerves részét képezik, ezeket később megismerjük.

Nézzük az alapvető műveleteket:

Útkereszteződés

A halmazok metszéspontja olyan halmaz, amely az összes adott halmazban egyszerre megjelenő elemeket tartalmaz.

["vasya", "petya"]

Ez a függvény tetszőleges számú tömböt fogad el. Vagyis egy hívásban tetszőleges számú tömb metszéspontját megtalálhatja.

Egy egyesület

A halmazok uniója olyan halmaz, amely az összes adott halmaz elemeit tartalmazza. A PHP-ben a set union nem hajtható végre egy hívással, de szimulálható két függvény összekapcsolásával:

["vasya", "kolya", "petya", "igor", "petya", "szergej", "vasya", "sasha"]; // egyedi eltávolítja a duplikátumokat $sharedFriends = array_unique($friends); // => ["vasya", "kolya", "petya", "igor", "sergey", "sasha"]

Összeadás (különbség)

Két halmaz különbsége egy olyan halmaz, amely az első halmaz elemeit tartalmazza, amelyek nem szerepelnek a másodikban. A programozásban ezt a műveletet gyakran ún diff.

["kolya"]

A sokasághoz való tartozás

Az in_array függvénnyel ellenőrizheti, hogy egy elem egy halmazhoz tartozik-e:

Feladat
Két tömb létezik, és meg akarja találni az egyesülésüket (minden elem, de ha egy elem mindkét tömbben van, akkor egyszer számolja), metszéspontját (elemek mindkét tömbben) vagy különbséget (egy tömb elemei, amelyek nincsenek benne a másik).

Megoldás
A szakszervezet meghatározása:
$union = tömb_egyedi(tömb_egyesítés($a, $b));

A kereszteződés kiszámításához:
$metszet = tömb_metszéspont($a, $b);

Az egyszerű különbség megtalálásához:
$különbség = array_diff($a, $b);

És a szimmetrikus különbség eléréséhez (kizárólagos VAGY):

Vita
Az ilyen számításokhoz szükséges összetevők közül sok be van építve a PHP-be, csak össze kell őket kombinálni a megfelelő sorrendben.

Ha két tömbből uniót kapunk, egy óriási tömb jön létre az eredeti tömbök összes értékével. De az array_merge() függvény lehetővé teszi az értékek megkettőzését, amikor két numerikus tömböt egyesít, ezért meg kell hívnia az array_unique() függvényt.
hogy kiszűrjük az ilyen elemeket.

Ez azonban hiányosságokat eredményezhet, mivel az array_unique() függvény nem tömöríti a tömböt. Ez azonban nem probléma, mert mind a foreach utasítás, mind az egyes() függvény interferencia nélkül kezeli a ritkán lakott tömböket.

A metszéspont kiszámítására szolgáló függvény egyszerűen array_intersection() nevet kap, és nem igényel további erőfeszítést.

Az array_diff() függvény egy tömböt ad vissza, amely tartalmazza a $old tömb minden egyedi elemét, amely nem szerepel az $new tömbben. Ezt egyszerű különbségnek nevezik:


$különbség = array_diff($régi, $új);
Sor
=> nem
=> to
)

Az eredményül kapott $difference tömb a "not" és a "to" szavakat tartalmazza, mivel az array_diff() megkülönbözteti a kis- és nagybetűket. Nem tartalmazza a "whatever" elemet, mert nincs benne a $old tömbben.

Az inverz különbség eléréséhez, vagy más szóval, a $new tömb azon egyedi elemeinek megtalálásához, amelyek hiányoznak a $old tömbből, fel kell cserélni az argumentumokat:
$old = array("To", "legyen", "vagy", "nem", "to", "legyen");
$new = array("To", "legyen", "vagy", "bármi");
$fordított_diff = tömb_diff($új, $régi);
Sor
=> mindegy
)

A $reverse_diff tömb csak a "whatever" elemet tartalmazza.

Ha függvényt vagy más szűrőt kell alkalmaznia az array_diff() függvényben, ágyazza be saját különbségi (kivonási) algoritmusát:

// kis- és nagybetűkre nem érzékeny kivonási algoritmus alkalmazása; különbség -i
$látott = array();
foreach ($új mint $n) (
$látott++;
}
foreach ($old mint $o) (
$o = strtolower($o);
if (!$látott[$o]) ( $diff[$o] = $o; )
}

Az első foreach utasítás asszociatív tömböt hoz létre a további kereséshez.

Ezután végighurkolja a $old tömböt, és ha az elemet nem találja a keresés során, akkor hozzáadja a $diff tömbhöz.

Ez a folyamat felgyorsítható az array_diff() és array_map() függvények kombinálásával:

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

A szimmetrikus különbség az, hogy mi van az $a-ban, de nem a $b-ben, plusz mi van a $b-ben, de nem az $a-ban:

$különbség = array_merge(tömb_különbség($a, $b), tömb_különbség($b, $a));

Ha létrejött, az algoritmus továbblép. Az array_diff() függvény kétszer kerül meghívásra, és két különbséget határoz meg. Ezután egy tömbbe egyesítik őket. Nincs szükség array_unique() meghívására, mivel ezeket a tömböket kifejezetten úgy tervezték, hogy ne legyenek közös elemeik.

Ezek a funkciók lehetővé teszik a tömbök különféle módon történő kezelését. A tömbök ideálisak változókészletek tárolására, módosítására és kezelésére.

Az egy- és többdimenziós tömbök támogatottak, mind a felhasználó által létrehozott, mind a függvény eredményeként visszaadott. Az adatbázisokkal való munkavégzéshez speciális funkciók állnak rendelkezésre, amelyek megkönnyítik a lekérdezések végrehajtása során visszaadott adattömbök kezelését; Vannak olyan függvények is, amelyek tömböket adnak vissza eredményként.

Ha többet szeretne megtudni a tömbök létrehozásáról és használatáról a PHP-ben, tekintse meg ennek az oktatóanyagnak a Tömbök című fejezetét.

Telepítés

Ezen szolgáltatások használatához nincs szükség telepítésre, mivel a PHP mag részét képezik.

Előre meghatározott állandók

Az alább felsorolt ​​állandók mindig elérhetők a PHP mag részeként.

CASE_LOWER(egész szám)

CASE_LOWER funkcióval együtt használjuk array_change_key_case() annak jelzésére, hogy a tömbkulcsokat kisbetűssé kell-e alakítani. Alapértelmezett funkció array_change_key_case() Ezt az állandót használják.

CASE_UPPER(egész szám)

CASE_UPPER funkcióval együtt használjuk array_change_key_case() annak jelzésére, hogy a tömbkulcsokat át kell-e alakítani nagybetűs karakterekké.

array_change_key_case -- Olyan tömb visszaadása, amelynek karakterkulcsait nagy- vagy kisbetűs karakterekké alakítják tömb_chunk -- Tömb felosztása darabokra tömb_kombináció -- Új tömb létrehozása az egyik tömb kulcsaként, a másik pedig a megfelelő értékekkel tömb_szám_értékei ​​- - Számolja meg az összes érték számát array_diff_assoc - A tömb eltérésének kiszámítása további indexellenőrzéssel array_diff_key - Számítsa ki a tömb eltérését a kulcsok összehasonlításával array_diff_uassoc - Számítsa ki a tömb divergenciáját további indexellenőrzéssel, amelyet egy felhasználó által megadott függvény segítségével végeznek el array_diff_ukey kulcs-összehasonlítás visszahívás tömb_diff -- Tömbdivergencia számítása tömb_kitöltés -- Tömb kitöltése adott értékkel tömb_szűrő -- Szűrő alkalmazása tömbre az array_flip callback segítségével -- Tömbértékek cseréje tömb_intersect_assoc -- A tömb konvergenciájának kiszámítása további indexellenőrzéssel array_intersect_key -- A tömb metszéspontjának kiszámítása a kulcsok összehasonlításával array_intersect_uassoc -- A tömb metszéspontjának kiszámítása további indexellenőrzéssel, amelyet a felhasználó által definiált array_intersect_ukey függvény segítségével végeznek el -- Tömb metszéspontjának kiszámítása kulcs-összehasonlítási visszahívás segítségével array_intersect -- A tömb konvergencia kulcsának kiszámítása array_key_uassoc -- Ellenőrizze, hogy létezik-e a megadott kulcs vagy index jelen van a tömbben tömb_kulcsok -- Jelölje ki az összes kulcsot a tömbben tömb_leképezés -- Visszahívási függvény alkalmazása a megadott tömbök összes elemére array_merge_recursive -- Két vagy több tömb rekurzív egyesítése array_merge -- Két vagy több tömb egyesítése array_multisort -- Több rendezés tömbök vagy többdimenziós tömbök tömb_pad -- Egy tömb méretének növelése egy adott értékre tömb_pop -- Egy tömb utolsó elemének lekérése array_product -- A tömbértékek szorzatának kiszámítása tömb_push -- Adjon hozzá egy vagy több elemet a végéhez egy tömb tömb_rand -- Válasszon ki egy vagy több véletlenszerű értéket a tömb_kicsinyítésből és visszaadja a megfelelő kulcsot, ha sikeres tömb_eltolás -- A tömb első elemének lekérése tömb_szelet - - Válasszon ki egy szeletet egy tömbből array_splice -- Távolítsa el a tömbelemek sorozatát, és cserélje ki egy másik sorozatra tömb_összeg -- A tömbértékek összegének kiszámítása ​​array_udiff_assoc -- Tömbök eltérésének kiszámítása további indexellenőrzéssel, az array_udiff_uassoc visszahívási függvény használatával az értékek összehasonlításához -- A tömbök eltérésének kiszámítása további indexellenőrzéssel, az array_udiff visszahívási függvény használatával értékek és indexek összehasonlításához -- Számítás tömbdivergencia az array_uintersect_assoc visszahívási függvénnyel összehasonlítás céljából -- Tömb metszéspontjának kiszámítása további indexellenőrzéssel, az array_uintersect_uassoc visszahívási függvénnyel az értékek összehasonlításához -- A tömb metszéspontjának kiszámítása további indexellenőrzéssel az array_uintersect visszahívás segítségével az indexek és értékek összehasonlításához - Számítsa ki a tömbök metszetét az array_unique callback segítségével az értékek összehasonlításához - Távolítsa el a duplikált értékeket egy tömbből array_unshift - Adjon hozzá egy vagy több elemet a tömb elejéhez array_values ​​- Válassza ki a tömb összes értékét egy tömb array_walk_recursive -- Egyéni függvény rekurzív alkalmazása az array_walk tömb minden elemére -- Egyéni függvény alkalmazása a tömb minden elemére -- Hozzon létre egy tömb arsort -- Rendezze a tömböt fordított sorrendben, megőrizve a kulcsok rendezését - - A tömb rendezése, a kulcsok tömör megőrzése - Változóneveket és azok értékeit tartalmazó tömb létrehozása