Funkcie pre prácu s poliami. Teória množín - PHP: Polia - Hexlet Php priesečník polí podľa hodnoty

Teória množín. Viem, koľko ľudí sa bojí matematikov, ale konkrétne teória množín (naivná) je veľmi jednoduchá a zrozumiteľná. Navyše jej prvky neustále využívame v každodennom živote. A v programovaní sa vyskytuje na každom kroku.

Základný koncept teórie množín prekvapivo je kopa. Súbor označuje súbor predmetov ľubovoľnej povahy, ktoré sa považujú za jeden celok. Najjednoduchším príkladom sú čísla. Sada arabských číslic obsahuje 10 prvkov a je Konečný. Koncept konečnosti je intuitívny a znamená, že množina má konečný počet prvkov.

Príkladom nekonečnej množiny sú prirodzené čísla. Množina prirodzených čísel je zase podmnožinou celých čísel, ktoré sú zase podmnožinou racionálnych čísel atď.

„Podmnožina“ znamená, že všetky prvky jednej množiny sú zahrnuté aj v inej množine, tzv nadmnožina(vo vzťahu k podmnožine).

Reprezentácia množín kruhmi je celkom pohodlná. Môžete rýchlo posúdiť, ako spolu rôzne sady súvisia.

Ale matematické objekty, ako sú čísla, nie sú jedinými možnými objektmi množín. Súpravou možno nazvať skupinu ľudí stojacich na autobusovej zastávke čakajúcich na svoj autobus alebo obyvateľov bytov v jednom dome, meste alebo krajine. Akákoľvek zbierka akýchkoľvek objektov, ktoré chceme považovať za jeden celok.

V teórii množín sú pre nás hlavné operácie na nich. Patria sem: sčítanie, spojenie, prienik, rozdiel, karteziánsky súčin a niektoré ďalšie.

Jednoduchý príklad. Keď navštívite stránku inej osoby na Facebooku, Facebook vám zobrazí blok so spoločnými priateľmi. Ak predpokladáme, že vaši priatelia a priatelia vášho priateľa sú dve množiny, potom spoloční priatelia sú množinou získanou ako priesečník pôvodných množín priateľov.

Keď prejdeme k programovaniu, všimnete si, že pole je veľmi podobné množine a skutočne si to tak možno predstaviť. Prečo je to také dôležité? Pochopením princípov určitých operácií ich môžete implementovať najrýchlejším a najefektívnejším spôsobom. Napríklad s vedomím, že v php potrebujete nastavenú operáciu priesečníka, môžete skúsiť nájsť funkciu, ktorá túto úlohu vykoná. Ak to chcete urobiť, stačí zadať dopyt do Google: php sa pretínajú(množina – množina, pretínať – priesečník). Prvý (aspoň pre mňa) odkaz vo výsledkoch vyhľadávania vedie k požadovanej funkcii array_intersect. To isté vás čaká aj pri ďalších operáciách. Toto je čiastočná odpoveď na otázku „Potrebujú programátori matematiku?

Mimochodom, nie všetky jazyky majú vstavané funkcie na prácu so sadami. V niektorých je na to potrebné nainštalovať ďalšie knižnice a v niektorých, napríklad v Ruby, sa operácie s množinami implementujú pomocou aritmetických operátorov (zjednotenie množín: coll1 + coll2).

Samostatne stojí za to povedať, že relačné databázy sú postavené na myšlienkach relačnej algebry, v ktorej zohráva ústrednú úlohu teória množín. Databázy sú neoddeliteľnou súčasťou vývoja webu a spoznáme ich neskôr.

Pozrime sa na základné operácie:

Križovatka

Priesečník množín je množina, ktorá obsahuje prvky vyskytujúce sa vo všetkých daných množinách súčasne.

["vasya", "petya"]

Táto funkcia akceptuje ľubovoľný počet polí. To znamená, že môžete nájsť priesečník ľubovoľného počtu polí v jednom hovore.

Združenie

Zjednotenie množín je množina, ktorá obsahuje prvky všetkých daných množín. Set union v PHP sa nedá urobiť jedným volaním, ale dá sa simulovať spojením dvoch funkcií:

["vasya", "kolya", "petya", "igor", "petya", "sergey", "vasya", "sasha"]; // jedinečný odstráni duplikáty $sharedFriends = array_unique($friends); // => ["vasya", "kolya", "petya", "igor", "sergey", "sasha"]

Sčítanie (rozdiel)

Rozdiel medzi dvoma sadami je sada, ktorá obsahuje prvky prvej sady, ktoré nie sú zahrnuté v druhej. V programovaní sa táto operácia často nazýva dif.

["kolya"]

Príslušnosť k množstvu

Pomocou funkcie in_array môžete skontrolovať, či prvok patrí do množiny:

Úloha
Existujú dve polia a chcete nájsť ich spojenie (všetky prvky, ale ak je prvok v oboch poliach, započíta sa raz), priesečník (prvky v oboch poliach) alebo rozdiel (prvky v jednom poli, ktoré nie sú v ostatný).

Riešenie
Ak chcete definovať zväzok:
$union = array_unique(pole_merge($a, $b));

Na výpočet križovatky:
$priesečník = array_intersection($a, $b);

Ak chcete nájsť jednoduchý rozdiel:
$rozdiel = array_diff($a, $b);

A získať symetrický rozdiel (exkluzívne OR):

Diskusia
Mnoho komponentov potrebných na takéto výpočty je zabudovaných do PHP, stačí ich skombinovať v príslušnom poradí.

Keď sa spojenie získa z dvoch polí, vytvorí sa jedno obrovské pole so všetkými hodnotami pôvodných polí. Funkcia array_merge() však umožňuje duplicitné hodnoty pri spájaní dvoch číselných polí, takže musíte zavolať funkciu array_unique().
na odfiltrovanie takýchto prvkov.

To však môže viesť k medzerám, pretože funkcia array_unique() nezhutňuje pole. To však nie je problém, pretože príkaz foreach aj funkcia every() zvládajú riedko osídlené polia bez rušenia.

Funkcia na výpočet priesečníka je jednoducho pomenovaná array_intersection() a nevyžaduje žiadne ďalšie úsilie.

Funkcia array_diff() vracia pole obsahujúce všetky jedinečné prvky $starého poľa, ktoré nie sú v poli $new. Toto sa nazýva jednoduchý rozdiel:


$rozdiel = array_diff($staré, $nové);
Pole
=> nie
=> do
)

Výsledné pole $difference obsahuje „not“ a „to“, pretože array_diff() rozlišuje veľké a malé písmená. Nezahŕňa prvok „čokoľvek“, pretože sa nenachádza v poli $old.

Ak chcete získať inverzný rozdiel, alebo, inými slovami, nájsť jedinečné prvky poľa $new, ktoré chýbajú v $starom poli, musíte vymeniť argumenty:
$starý = array("Komu", "byť", "alebo", "nie", "do", "byť");
$new = array("Komu", "byť", "alebo", "čokoľvek");
$reverse_diff = array_diff($nové, $staré);
Pole
=> čokoľvek
)

Pole $reverse_diff obsahuje iba prvok „čokoľvek“.

Ak potrebujete použiť funkciu alebo iný filter vo funkcii array_diff(), vložte svoj vlastný rozdielový (odčítací) algoritmus:

// použiť algoritmus odčítania bez ohľadu na veľkosť písmen; rozdiel -i
$videl = pole();
foreach ($new as $n) (
$videný++;
}
foreach ($starý ako $o) (
$o = strtolower($o);
if (!$seen[$o]) ( $diff[$o] = $o; )
}

Prvý príkaz foreach vytvára asociatívne pole pre ďalšie vyhľadávanie.

Potom prejde cez pole $old a ak sa prvok počas vyhľadávania nenájde, pridá sa do poľa $diff.

Tento proces je možné urýchliť kombináciou funkcií array_diff() a array_map():

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

Symetrický rozdiel je v tom, čo je v $a, ale nie v $b, plus to, čo je v $b, ale nie v $a:

$rozdiel = array_merge(pole_diff($a, $b), array_diff($b, $a));

Po vytvorení sa algoritmus posúva dopredu. Funkcia array_diff() sa volá dvakrát a určuje dva rozdiely. Potom sa spoja do jedného poľa. Nie je potrebné volať array_unique(), pretože tieto polia boli špeciálne navrhnuté tak, aby nemali žiadne spoločné prvky.

Tieto funkcie vám umožňujú manipulovať s poľami rôznymi spôsobmi. Polia sú ideálne na ukladanie, úpravu a prácu s množinami premenných.

Podporované sú jednorozmerné a viacrozmerné polia, vytvorené používateľom a vrátené ako výsledok nejakou funkciou. Existujú špeciálne funkcie na prácu s databázami, ktoré uľahčujú prácu s poľami údajov vrátených v dôsledku vykonávania dotazov; Existujú aj funkcie, ktoré vracajú polia ako výsledky.

Ak sa chcete dozvedieť viac o tom, ako sa polia vytvárajú a používajú v PHP, pozrite si kapitolu Polia tohto návodu.

Inštalácia

Na používanie týchto funkcií nie je potrebná žiadna inštalácia, pretože sú súčasťou jadra PHP.

Preddefinované konštanty

Konštanty uvedené nižšie sú vždy dostupné ako súčasť jadra PHP.

CASE_LOWER(celé číslo)

CASE_LOWER používa sa s funkciou array_change_key_case() na označenie, či sa majú kľúče poľa previesť na malé písmená. Predvolená funkcia array_change_key_case() Táto konštanta sa používa.

CASE_UPPER(celé číslo)

CASE_UPPER používa sa s funkciou array_change_key_case() na označenie, či sa majú kľúče poľa previesť na veľké písmená.

array_change_key_case -- Vráti pole, ktorého znakové kľúče sú skonvertované na veľké alebo malé písmená array_chunk -- Rozdelenie poľa na časti array_combine -- Vytvorenie nového poľa s použitím jedného poľa ako kľúčov a druhého ako zodpovedajúcich hodnôt pole_count_values ​​​​- - Spočítajte počet všetkých hodnôt array_diff_assoc -- Vypočítajte divergenciu poľa s dodatočnou kontrolou indexu array_diff_key -- Vypočítajte divergenciu poľa porovnaním kľúčov array_diff_uassoc -- Vypočítajte divergenciu poľa s dodatočnou kontrolou indexu vykonanou pomocou užívateľom definovanej funkcie array_diff_ukey -- Vypočítajte divergenciu poľa pomocou spätné volanie porovnania kľúča array_diff -- Vypočítajte divergenciu poľa array_fill -- Vyplňte pole konkrétnou hodnotou array_filter -- Použite filter na pole pomocou spätného volania array_flip -- Zameňte hodnoty poľa ​​array_intersect_assoc -- Vypočítajte konvergenciu poľa s dodatočnou kontrolou indexu array_intersect_key -- Vypočítajte priesečník poľa porovnaním kľúčov array_intersect_uassoc -- Vypočítajte priesečník poľa s dodatočnou kontrolou indexu vykonanou pomocou používateľom definovanej funkcie array_intersect_ukey -- Vypočítajte priesečník poľa pomocou spätného volania porovnania kľúča array_intersect -- Vypočítajte konvergenciu poľa array_key_exists -- Skontrolujte, či je zadaný kľúč alebo index je prítomný v poli array_keys -- Vybrať všetky kľúče v poli array_map -- Použiť funkciu spätného volania na všetky prvky zadaných polí array_merge_recursive -- Rekurzívne zlúčiť dve alebo viac polí array_merge -- Zlúčiť dve alebo viac polí array_multisort -- Zoradiť viac polia alebo viacrozmerné polia array_pad -- Zväčšiť veľkosť poľa na danú hodnotu array_pop -- Získať posledný prvok poľa array_product -- Vypočítať súčin hodnôt poľa ​​array_push -- Pridať jeden alebo viac prvkov na koniec poľa pole array_rand -- Vyberte jednu alebo viac náhodných hodnôt z array_reduce -- Iteratívne zredukujte pole na jednu hodnotu pomocou funkcie spätného volania array_reverse -- Vráti pole s prvkami v opačnom poradí array_search -- Vyhľadá pole pre danú hodnotu a v prípade úspechu vráti zodpovedajúci kľúč array_shift -- Získanie prvého prvku poľa array_slice - - Výber časti poľa array_splice - Odstránenie sekvencie prvkov poľa a jej nahradenie inou sekvenciou array_sum - Výpočet súčtu hodnôt poľa ​​array_udiff_assoc -- Vypočítajte divergenciu v poliach s dodatočnou kontrolou indexu pomocou funkcie spätného volania array_udiff_uassoc na porovnanie hodnôt -- Vypočítajte divergenciu v poliach s dodatočnou kontrolou indexu, pomocou funkcie spätného volania array_udiff porovnajte hodnoty a indexy -- Vypočítajte divergencia poľa pomocou funkcie spätného volania array_uintersect_assoc na porovnanie -- Vypočítajte priesečník poľa s dodatočnou kontrolou indexu, pomocou funkcie spätného volania array_uintersect_uassoc porovnajte hodnoty -- Vypočítajte priesečník poľa s dodatočnou kontrolou indexu pomocou spätného volania array_uintersect na porovnanie indexov a hodnôt - - Vypočítajte priesečník polí pomocou spätného volania array_unique na porovnanie hodnôt -- Odstráňte duplicitné hodnoty z poľa array_unshift -- Pridajte jeden alebo viac prvkov na začiatok poľa array_values ​​​​ -- Vyberte všetky hodnoty pole array_walk_recursive -- Rekurzívne aplikujte vlastnú funkciu na každý prvok poľa array_walk -- Aplikujte vlastnú funkciu na každý prvok poľa poľa -- Vytvorte pole arsort -- Zoraďte pole v opačnom poradí, pričom kľúče zachovajte asort - - Zoraďte pole a zachovajte kompaktnosť kľúčov - Vytvorte pole obsahujúce názvy premenných a ich hodnoty