Funkcje do pracy z tablicami. Teoria mnogości - PHP: Tablice - Przecięcie Hexlet Php tablic według wartości

Teoria zbiorów. Wiem, ile osób boi się matematyków, ale konkretnie teoria mnogości (naiwna) jest bardzo prosta i zrozumiała. Co więcej, stale korzystamy z jego elementów w życiu codziennym. A w programowaniu dzieje się to na każdym kroku.

Co zaskakujące, podstawową koncepcją teorii mnogości jest: pęczek. Zbiór oznacza zbiór obiektów o dowolnym charakterze, rozpatrywanych jako pojedyncza całość. Najprostszym przykładem są liczby. Zbiór cyfr arabskich składa się z 10 elementów i jest finał. Pojęcie skończoności jest intuicyjne i oznacza, że ​​zbiór ma skończoną liczbę elementów.

Przykładem nieskończonego zbioru są liczby naturalne. Z kolei zbiór liczb naturalnych jest podzbiorem liczb całkowitych, które z kolei są podzbiorem liczb wymiernych i tak dalej.

„Podzbiór” oznacza, że ​​wszystkie elementy jednego zbioru znajdują się także w innym zbiorze, tzw nadzbiór(w odniesieniu do podzbioru).

Całkiem wygodne jest reprezentowanie zbiorów za pomocą okręgów. Możesz szybko ocenić, jak różne zestawy odnoszą się do siebie.

Jednak obiekty matematyczne, takie jak liczby, nie są jedynymi możliwymi obiektami zbiorów. Zestawem można nazwać grupę osób stojących na przystanku autobusowym w oczekiwaniu na swój autobus lub mieszkańców mieszkań w jednym domu, mieście lub kraju. Dowolny zbiór dowolnych obiektów, który chcemy traktować jako jedną całość.

Dla nas w teorii mnogości najważniejsze są operacje na nich. Należą do nich: dodawanie, suma, przecięcie, różnica, iloczyn kartezjański i kilka innych.

Prosty przykład. Gdy odwiedzasz stronę innej osoby na Facebooku, Facebook wyświetla blokadę ze wspólnymi znajomymi. Jeśli założymy, że twoi przyjaciele i przyjaciele twojego przyjaciela to dwa zbiory, to wspólni przyjaciele to zbiór otrzymany jako przecięcie pierwotnych zbiorów przyjaciół.

Przechodząc do programowania, zauważysz, że tablica jest bardzo podobna do zbioru i rzeczywiście można o niej myśleć w ten sposób. Dlaczego jest to takie ważne? Rozumiejąc zasady stojące za niektórymi operacjami, możesz je wdrożyć najszybciej i najbardziej efektywnie. Na przykład, wiedząc, że potrzebujesz ustawionej operacji przecięcia w php, możesz spróbować znaleźć funkcję, która wykona to zadanie. Aby to zrobić wystarczy wpisać zapytanie w Google: zestaw php przecina się(zestaw - zestaw, przecięcie - przecięcie). Pierwszy (przynajmniej dla mnie) link w wynikach wyszukiwania prowadzi do pożądanej funkcji array_intersect. To samo czeka Cię z innymi operacjami. To częściowa odpowiedź na pytanie „czy programistom potrzebna jest matematyka?”

Nawiasem mówiąc, nie wszystkie języki mają wbudowane funkcje do pracy z zestawami. W niektórych trzeba do tego zainstalować dodatkowe biblioteki, a w niektórych np. w Ruby operacje na zbiorach realizowane są za pomocą operatorów arytmetycznych (suma zbiorów: coll1 + coll2).

Osobno warto powiedzieć, że relacyjne bazy danych zbudowane są na ideach algebry relacyjnej, w której centralną rolę odgrywa teoria mnogości. Bazy danych są integralną częścią tworzenia stron internetowych i poznamy je później.

Przyjrzyjmy się podstawowym operacjom:

Skrzyżowanie

Przecięciem zbiorów jest zbiór zawierający elementy występujące we wszystkich podanych zbiorach jednocześnie.

["wasja", "pietia"]

Ta funkcja akceptuje dowolną liczbę tablic. Oznacza to, że w jednym wywołaniu można znaleźć przecięcie dowolnej liczby tablic.

Stowarzyszenie

Suma zbiorów to zbiór zawierający elementy wszystkich danych zbiorów. Zestawu unii w PHP nie można wykonać jednym wywołaniem, ale można to zasymulować, łącząc dwie funkcje:

["wasja", "kolja", "petya", "igor", "petya", "siergiej", "wasja", "sasza"]; // Unique usuwa duplikaty $sharedFriends = array_unique($friends); // => ["vasya", "kolya", "petya", "igor", "siergiej", "sasha"]

Dodatek (różnica)

Różnica dwóch zbiorów to zbiór zawierający elementy pierwszego zbioru, które nie są zawarte w drugim. W programowaniu operacja ta jest często nazywana różnica.

["kola"]

Przynależność do wielości

Możesz sprawdzić, czy element należy do zbioru, używając funkcji in_array:

Zadanie
Istnieją dwie tablice i chcesz znaleźć ich sumę (wszystkie elementy, ale jeśli element znajduje się w obu tablicach, jest on liczony raz), przecięcie (elementy w obu tablicach) lub różnicę (elementy w jednej tablicy, których nie ma w inny).

Rozwiązanie
Aby zdefiniować związek:
$union = array_unique(array_merge($a, $b));

Aby obliczyć przecięcie:
$przecięcie = przecięcie_tablicy($a, $b);

Aby znaleźć prostą różnicę:
$różnica = array_diff($a, $b);

Aby uzyskać różnicę symetryczną (wyłącznie OR):

Dyskusja
Wiele komponentów wymaganych do takich obliczeń jest wbudowanych w PHP, wystarczy połączyć je w odpowiedniej kolejności.

Po uzyskaniu unii z dwóch tablic tworzona jest jedna gigantyczna tablica ze wszystkimi wartościami oryginalnych tablic. Ale funkcja array_merge() pozwala na duplikowanie wartości podczas łączenia dwóch tablic numerycznych, więc musisz wywołać funkcję array_unique().
do odfiltrowania takich elementów.

Może to jednak skutkować lukami, ponieważ funkcja array_unique() nie powoduje kompaktowania tablicy. Nie stanowi to jednak problemu, ponieważ zarówno instrukcja foreach, jak i funkcja each() obsługują słabo zapełnione tablice bez zakłóceń.

Funkcja obliczania przecięcia nazywa się po prostu array_intersection() i nie wymaga żadnego dodatkowego wysiłku.

Funkcja array_diff() zwraca tablicę zawierającą wszystkie unikalne elementy tablicy $old, których nie ma w tablicy $new. Nazywa się to prostą różnicą:


$różnica = array_diff($stare, $nowe);
Szyk
=> nie
=> do
)

Wynikowa tablica $difference zawiera „not” i „to”, ponieważ array_diff() rozróżnia wielkość liter. Nie zawiera elementu „cokolwiek”, ponieważ nie znajduje się on w tablicy $old.

Aby uzyskać odwrotną różnicę, czyli innymi słowy znaleźć unikalne elementy tablicy $new, których brakuje w tablicy $old, musisz zamienić argumenty:
$old = array("Do", "być", "lub", "nie", "do", "być");
$nowy = array("Do", "być", "lub", "cokolwiek");
$reverse_diff = array_diff($nowy, $stary);
Szyk
=> nieważne
)

Tablica $reverse_diff zawiera tylko element „cokolwiek”.

Jeśli chcesz zastosować funkcję lub inny filtr w funkcji array_diff(), osadź własny algorytm różnicy (odejmowanie):

// zastosuj algorytm odejmowania nieuwzględniający wielkości liter; różnica -tj
$widziane = tablica();
foreach ($nowy jako $n) (
$widziano++;
}
foreach ($stare jak $o) (
$o = strtolower($o);
if (!$widziano[$o]) ( $diff[$o] = $o; )
}

Pierwsza instrukcja foreach tworzy tablicę asocjacyjną do dalszego wyszukiwania.

Następnie przechodzi przez tablicę $old i jeśli element nie zostanie znaleziony podczas wyszukiwania, jest dodawany do tablicy $diff.

Proces ten można przyspieszyć, łącząc funkcje array_diff() i array_map():

$diff = array_diff(array_map("strtolower", $stary),
array_map("strtolower", $nowy));

Różnica symetryczna to to, co jest w $a, ale nie jest w $b, plus to, co jest w $b, ale nie jest w $a:

$różnica = array_merge(array_diff($a, $b), array_diff($b, $a));

Po ustaleniu algorytm postępuje dalej. Funkcja array_diff() jest wywoływana dwukrotnie i określa dwie różnice. Następnie są one łączone w jedną tablicę. Nie ma potrzeby wywoływania funkcji array_unique(), ponieważ te tablice zostały specjalnie zaprojektowane tak, aby nie miały wspólnych elementów.

Funkcje te umożliwiają manipulowanie tablicami na różne sposoby. Tablice idealnie nadają się do przechowywania, modyfikowania i pracy z zestawami zmiennych.

Obsługiwane są tablice jedno- i wielowymiarowe, zarówno utworzone przez użytkownika, jak i zwrócone w wyniku jakiejś funkcji. Istnieją specjalne funkcje do pracy z bazami danych, które ułatwiają pracę z tablicami danych zwracanych w wyniku wykonywania zapytań; Istnieją również funkcje, które zwracają tablice jako wyniki.

Aby dowiedzieć się więcej o tym, jak tablice są tworzone i używane w PHP, zobacz rozdział Tablice w tym samouczku.

Instalacja

Aby korzystać z tych funkcji, nie jest wymagana instalacja, ponieważ są one częścią rdzenia PHP.

Predefiniowane stałe

Stałe wymienione poniżej są zawsze dostępne jako część rdzenia PHP.

CASE_LOWER(liczba całkowita)

CASE_LOWER używany z funkcją array_change_key_case() aby wskazać, czy klucze tablicy powinny być konwertowane na małe litery. Funkcja domyślna array_change_key_case() Ta stała jest używana.

PRZYPADEK_GÓRNY(liczba całkowita)

PRZYPADEK_GÓRNY używany z funkcją array_change_key_case() aby wskazać, czy klucze tablicy powinny być konwertowane na wielkie litery.

array_change_key_case -- Zwraca tablicę, której klucze znakowe są konwertowane na wielkie lub małe litery array_chunk -- Podziel tablicę na kawałki array_combine -- Utwórz nową tablicę, używając jednej tablicy jako kluczy, a drugiej jako odpowiednich wartości array_count_values ​​- - Policz liczbę wszystkich wartości array_diff_assoc -- Oblicz rozbieżność tablicy za pomocą dodatkowego sprawdzania indeksu array_diff_key -- Oblicz rozbieżność tablicy poprzez porównanie kluczy array_diff_uassoc -- Oblicz rozbieżność tablicy za pomocą dodatkowego sprawdzania indeksu wykonanego przy użyciu funkcji zdefiniowanej przez użytkownika array_diff_ukey -- Oblicz rozbieżność tablicy za pomocą wywołanie zwrotne porównania kluczy array_diff -- Oblicz rozbieżność tablicy array_fill -- Wypełnij tablicę określoną wartością array_filter -- Zastosuj filtr do tablicy za pomocą wywołania zwrotnego array_flip -- Zamień wartości tablicy Array_intersect_assoc -- Oblicz zbieżność tablicy z dodatkowym sprawdzeniem indeksu array_intersect_key -- Oblicz przecięcie tablicy poprzez porównanie kluczy array_intersect_uassoc -- Oblicz przecięcie tablicy z dodatkowym sprawdzeniem indeksu przy użyciu funkcji zdefiniowanej przez użytkownika array_intersect_ukey -- Oblicz przecięcie tablicy za pomocą wywołania zwrotnego porównania kluczy array_intersect -- Oblicz zbieżność tablicy array_key_exists -- Sprawdź, czy określony klucz lub indeks jest obecny w tablicy array_keys -- Wybierz wszystkie klucze w tablicy array_map -- Zastosuj funkcję wywołania zwrotnego do wszystkich elementów określonych tablic array_merge_recursive -- Rekursywnie scal dwie lub więcej tablic array_merge -- Scal dwie lub więcej tablic array_multisort -- Sortuj wielokrotne arrays lub tablice wielowymiarowe array_pad -- Zwiększ rozmiar tablicy do podanej wartości array_pop -- Pobierz ostatni element tablicy array_product -- Oblicz iloczyn wartości tablicy tablica_push -- Dodaj jeden lub więcej elementów na końcu tablica array_rand -- Wybierz jedną lub więcej losowych wartości z array_reduce -- Iteracyjnie zredukuj tablicę do pojedynczej wartości za pomocą funkcji wywołania zwrotnego array_reverse -- Zwraca tablicę z elementami w odwrotnej kolejności array_search -- Przeszukuje tablicę pod kątem podanej wartości i zwraca odpowiedni klucz, jeśli się powiedzie. array_shift -- Pobierz pierwszy element tablicy array_slice - - Wybierz wycinek tablicy array_splice -- Usuń sekwencję elementów tablicy i zastąp ją inną sekwencją array_sum -- Oblicz sumę wartości tablicy ​​array_udiff_assoc -- Oblicz rozbieżność w tablicach z dodatkowym sprawdzaniem indeksu, używając funkcji wywołania zwrotnego array_udiff_uassoc do porównywania wartości -- Oblicz rozbieżność w tablicach z dodatkowym sprawdzaniem indeksu, używając funkcji wywołania zwrotnego array_udiff do porównywania wartości i indeksów -- Oblicz rozbieżność tablicy przy użyciu funkcji wywołania zwrotnego array_uintersect_assoc dla porównania -- Oblicz przecięcie tablicy z dodatkowym sprawdzaniem indeksu, używając funkcji wywołania zwrotnego array_uintersect_uassoc do porównania wartości -- Oblicz przecięcie tablicy z dodatkowym sprawdzeniem indeksu przy użyciu wywołania zwrotnego array_uintersect w celu porównania indeksów i wartości - - Oblicz przecięcie tablic za pomocą wywołania zwrotnego array_unique w celu porównania wartości - Usuń zduplikowane wartości z tablicy array_unshift - Dodaj jeden lub więcej elementów na początek tablicy array_values ​​- Wybierz wszystkie wartości tablica array_walk_recursive -- Rekurencyjnie zastosuj funkcję niestandardową do każdego elementu tablicy array_walk -- Zastosuj funkcję niestandardową do każdego elementu tablicy array -- Utwórz tablicę arsort -- Posortuj tablicę w odwrotnej kolejności, zachowując sortowanie kluczy - - Sortuj tablicę, zachowując klucze kompaktowe. - Utwórz tablicę zawierającą nazwy zmiennych i ich wartości