Funkce pro práci s poli. Teorie množin - PHP: Pole - Hexlet Php průnik polí podle hodnoty

Teorie množin. Vím, kolik lidí se bojí matematiků, ale konkrétně teorie množin (naivní) je velmi jednoduchá a srozumitelná. Navíc jeho prvky neustále využíváme v každodenním životě. A v programování se vyskytuje na každém kroku.

Základním konceptem teorie množin překvapivě je hromada. Soubor označuje sbírku předmětů libovolné povahy, považovaných za jeden celek. Nejjednodušším příkladem jsou čísla. Sada arabských číslic obsahuje 10 prvků a je finále. Koncept konečnosti je intuitivní a znamená, že množina má konečný počet prvků.

Příkladem nekonečné množiny jsou přirozená čísla. Množina přirozených čísel je zase podmnožinou celých čísel, která jsou zase podmnožinou racionálních čísel a tak dále.

"Podmnožina" znamená, že všechny prvky jedné sady jsou také zahrnuty do jiné sady, tzv superset(vzhledem k podmnožině).

Reprezentovat množiny kruhy je docela pohodlné. Můžete rychle posoudit, jak spolu různé sady souvisí.

Ale matematické objekty, jako jsou čísla, nejsou jedinými možnými objekty množin. Soupravou lze nazvat skupinu lidí stojících na zastávce a čekajících na svůj autobus nebo obyvatele bytů v jednom domě, městě nebo zemi. Libovolná sbírka jakýchkoli objektů, které chceme považovat za jeden celek.

Hlavní věcí pro nás v teorii množin jsou operace na nich. Patří sem: sčítání, sjednocení, průnik, rozdíl, kartézský součin a některé další.

Jednoduchý příklad. Když navštívíte stránku jiné osoby na Facebooku, Facebook vám zobrazí blok se společnými přáteli. Pokud předpokládáme, že vaši přátelé a přátelé vašeho přítele jsou dvě množiny, pak společní přátelé jsou množinou získanou jako průnik původních množin přátel.

Když přejdeme k programování, všimnete si, že pole je velmi podobné množině a skutečně si tak lze představit. Proč je to tak důležité? Pochopením principů určitých operací je můžete implementovat nejrychlejším a nejefektivnějším způsobem. Pokud například víte, že v php potřebujete nastavit operaci průniku, můžete zkusit najít funkci, která daný úkol provede. Chcete-li to provést, stačí zadat dotaz do Googlu: php se protínají(set - set, intersect - průnik). První (alespoň pro mě) odkaz ve výsledcích vyhledávání vede na požadovanou funkci array_intersect. To samé vás čeká s dalšími operacemi. Toto je částečná odpověď na otázku „Potřebují programátoři matematiku?

Mimochodem, ne všechny jazyky mají vestavěné funkce pro práci se sadami. V některých je k tomu potřeba nainstalovat další knihovny a v některých, například v Ruby, jsou operace s množinami implementovány pomocí aritmetických operátorů (sjednocení množin: coll1 + coll2).

Samostatně stojí za to říci, že relační databáze jsou postaveny na myšlenkách relační algebry, v níž teorie množin hraje ústřední roli. Databáze jsou nedílnou součástí vývoje webu a seznámíme se s nimi později.

Podívejme se na základní operace:

Průsečík

Průnik množin je množina, která obsahuje prvky, které se vyskytují ve všech daných množinách současně.

["vasya", "petya"]

Tato funkce přijímá libovolný počet polí. To znamená, že můžete najít průsečík libovolného počtu polí v jednom volání.

Sdružení

Sjednocení množin je množina, která obsahuje prvky všech daných množin. Set Union v PHP nelze provést jedním voláním, ale lze jej simulovat propojením dvou funkcí:

["vasya", "kolya", "petya", "igor", "petya", "sergey", "vasya", "sasha"]; // jedinečný odstraní duplicity $sharedFriends = array_unique($friends); // => ["vasya", "kolya", "petya", "igor", "sergey", "sasha"]

Sčítání (rozdíl)

Rozdíl dvou sad je sada, která obsahuje prvky první sady, které nejsou zahrnuty ve druhé. V programování se tato operace často nazývá dif.

["kolya"]

Příslušnost k množství

Zda prvek patří do sady, můžete zkontrolovat pomocí funkce in_array:

Úkol
Existují dvě pole a chcete najít jejich sjednocení (všechny prvky, ale pokud je prvek v obou polích, započítá se jednou), průnik (prvky v obou polích) nebo rozdíl (prvky v jednom poli, které nejsou v jiný).

Řešení
Chcete-li definovat sjednocení:
$union = array_unique(array_merge($a, $b));

Pro výpočet křižovatky:
$intersection = array_intersection($a, $b);

Chcete-li najít jednoduchý rozdíl:
$rozdíl = array_diff($a, $b);

A získat symetrický rozdíl (exkluzivní OR):

Diskuse
Mnoho komponent potřebných pro takové výpočty je zabudováno do PHP, stačí je zkombinovat ve vhodném pořadí.

Když se získá spojení ze dvou polí, vytvoří se jedno obrovské pole se všemi hodnotami původních polí. Ale funkce array_merge() umožňuje duplicitní hodnoty při slučování dvou číselných polí, takže musíte zavolat funkci array_unique().
k odfiltrování takových prvků.

To však může mít za následek mezery, protože funkce array_unique() nezkomprimuje pole. To však není problém, protože jak příkaz foreach, tak funkce every() zpracovávají řídce obsazená pole bez interference.

Funkce pro výpočet průniku se jednoduše jmenuje array_intersection() a nevyžaduje žádné další úsilí.

Funkce array_diff() vrací pole obsahující všechny jedinečné prvky pole $old, které nejsou v poli $new. Tomu se říká jednoduchý rozdíl:


$rozdíl = array_diff($starý, $nový);
Pole
=> ne
=> do
)

Výsledné pole $difference obsahuje „not“ a „to“, protože array_diff() rozlišuje velká a malá písmena. Nezahrnuje prvek „cokoli“, protože není v poli $old.

Chcete-li získat inverzní rozdíl, nebo jinými slovy, najít jedinečné prvky pole $new, které chybí ve starém poli $, musíte zaměnit argumenty:
$old = array("To", "být", "nebo", "ne", "to", "být");
$new = array("To", "být", "nebo", "cokoliv");
$reverse_diff = array_diff($new, $starý);
Pole
=> cokoliv
)

Pole $reverse_diff obsahuje pouze prvek „cokoli“.

Pokud potřebujete použít funkci nebo jiný filtr ve funkci array_diff(), vložte svůj vlastní algoritmus rozdílu (odčítání):

// použití odčítacího algoritmu bez ohledu na velikost písmen; rozdíl -i
$vidět = pole();
foreach ($new as $n) (
$viděl++;
}
foreach ($starý jako $o) (
$o = strtolower($o);
if (!$seen[$o]) ( $diff[$o] = $o; )
}

První příkaz foreach vytvoří asociativní pole pro další vyhledávání.

Poté prochází polem $old, a pokud není prvek během vyhledávání nalezen, je přidán do pole $diff.

Tento proces lze urychlit kombinací funkcí array_diff() a array_map():

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

Symetrický rozdíl je v tom, co je v $a, ale ne v $b, plus co je v $b, ale ne v $a:

$rozdíl = array_merge(array_diff($a, $b), array_diff($b, $a));

Po vytvoření se algoritmus posouvá vpřed. Funkce array_diff() je volána dvakrát a určuje dva rozdíly. Poté se spojí do jednoho pole. Není třeba volat array_unique(), protože tato pole byla speciálně navržena tak, aby neměla žádné společné prvky.

Tyto funkce umožňují manipulovat s poli různými způsoby. Pole jsou ideální pro ukládání, úpravy a práci se sadami proměnných.

Jsou podporována jednorozměrná a vícerozměrná pole, vytvořená uživatelem a vrácená jako výsledek nějakou funkcí. Existují speciální funkce pro práci s databázemi, které usnadňují práci s poli dat vrácených v důsledku provádění dotazů; Existují také funkce, které vracejí pole jako výsledky.

Chcete-li se dozvědět více o tom, jak jsou pole vytvářena a používána v PHP, viz kapitola Pole v tomto kurzu.

Instalace

K použití těchto funkcí není nutná žádná instalace, protože jsou součástí jádra PHP.

Předdefinované konstanty

Níže uvedené konstanty jsou vždy dostupné jako součást jádra PHP.

CASE_LOWER(celé číslo)

CASE_LOWER používá se s funkcí array_change_key_case() k označení, zda mají být klíče pole převedeny na malá písmena. Výchozí funkce array_change_key_case() Tato konstanta se používá.

CASE_UPPER(celé číslo)

CASE_UPPER používá se s funkcí array_change_key_case() k označení, zda mají být klíče pole převedeny na velká písmena.

array_change_key_case -- Vrátí pole, jehož znakové klíče jsou převedeny na velká nebo malá písmena array_chunk -- Rozdělte pole na části array_combine -- Vytvořte nové pole s použitím jednoho pole jako klíčů a jiného jako odpovídajících hodnot pole_count_values ​​- - Spočítat počet všech hodnot array_diff_assoc -- Vypočítat divergenci pole s další kontrolou indexu array_diff_key -- Vypočítat divergenci pole porovnáním klíčů array_diff_uassoc -- Vypočítat divergenci pole s další kontrolou indexu provedenou pomocí uživatelem definované funkce array_diff_ukey -- Vypočítat divergenci pole pomocí zpětné volání porovnání klíčů array_diff -- Vypočítat divergenci pole array_fill -- Vyplnit pole konkrétní hodnotou array_filter -- Aplikovat filtr na pole pomocí zpětného volání array_flip -- Zaměnit hodnoty pole ​​array_intersect_assoc -- Vypočítat konvergenci pole s další kontrolou indexu array_intersect_key -- Vypočítat průnik pole porovnáním klíčů array_intersect_uassoc -- Vypočítat průnik pole s další kontrolou indexu provedenou pomocí uživatelem definované funkce array_intersect_ukey -- Vypočítat průnik pole pomocí zpětného volání porovnávání klíčů array_intersect -- Vypočítat konvergenci pole array_key_exists -- Zkontrolujte, zda je zadaný klíč nebo index je přítomen v poli array_keys -- Vybrat všechny klíče v poli array_map -- Použít funkci zpětného volání na všechny prvky zadaných polí array_merge_recursive -- Rekurzivně sloučit dvě nebo více polí array_merge -- Sloučit dvě nebo více polí array_multisort -- Seřadit více pole nebo vícerozměrná pole array_pad -- Zvětšete velikost pole na danou hodnotu array_pop -- Načtěte poslední prvek pole array_product -- Vypočítejte součin hodnot pole ​​array_push -- Přidejte jeden nebo více prvků na konec pole pole array_rand -- Vyberte jednu nebo více náhodných hodnot z array_reduce -- Iterativně zredukujte pole na jednu hodnotu pomocí funkce zpětného volání array_reverse -- Vrátí pole s prvky v obráceném pořadí array_search -- Vyhledá pole pro danou hodnotu a v případě úspěchu vrátí odpovídající klíč array_shift -- Načte první prvek pole array_slice -- Vyberte řez pole array_splice -- Odeberte sekvenci prvků pole a nahraďte ji jinou sekvencí array_sum -- Vypočítejte součet hodnot pole ​​array_udiff_assoc – Výpočet divergence v polích s dodatečnou kontrolou indexu, pomocí funkce zpětného volání array_udiff_uassoc k porovnání hodnot – Výpočet divergence v polích s další kontrolou indexu, pomocí funkce zpětného volání array_udiff k porovnání hodnot a indexů – Výpočet divergence pole pomocí funkce zpětného volání array_uintersect_assoc pro porovnání -- Vypočítat průnik pole s další kontrolou indexu, pomocí funkce zpětného volání array_uintersect_uassoc porovnat hodnoty -- Vypočítat průnik pole s další kontrolou indexu pomocí zpětného volání array_uintersect pro porovnání indexů a hodnot - - Vypočítejte průnik polí pomocí zpětného volání array_unique pro porovnání hodnot -- Odstraňte duplicitní hodnoty z pole array_unshift -- Přidejte jeden nebo více prvků na začátek pole array_values ​​​​ -- Vyberte všechny hodnoty pole array_walk_recursive -- Rekurzivně aplikujte vlastní funkci na každý prvek pole array_walk -- Aplikujte vlastní funkci na každý prvek pole pole -- Vytvořte pole arsort -- Seřaďte pole v opačném pořadí, zachovávejte klíče asort - - Seřaďte pole, zachovejte kompaktnost klíčů - Vytvořte pole obsahující názvy proměnných a jejich hodnoty