Okna.  Wirusy.  Laptopy.  Internet.  Biuro.  Narzędzia.  Kierowcy

PHP jest dobrze zorientowane na przetwarzanie informacji. Składnia języka jest reprezentowana przez w pełni funkcjonalny zestaw funkcji porównawczych, przetwarzania ciągów i operatorów porównania.

Każdy algorytm to ciąg wyborów i działań. Ale zanim dokonasz wyboru, musisz coś z czymś porównać. Struny są najbardziej pojemnym, wydajnym i praktycznym mechanizmem sterowania algorytmem. Wiersze są opcją reprezentacji danych. A dane są głównym przedmiotem zainteresowania każdego algorytmu.

Konwencjonalna logika działania porównawczego

Ogólnie rzecz biorąc, język nie wprowadza żadnych specjalnych różnic w danych; na przykład w PHP porównywanie ciągu znaków i liczby nie różni się zbytnio. Liczba jest także ciągiem znaków, jeśli zawiera tylko cyfry, kropkę i nie zawiera żadnych znaków, które nie są używane do przedstawienia liczby w żadnej formie (notacja matematyczna).

W przypadku kontrowersji liczba jest automatycznie scalana w ciąg znaków bez zbędnych pytań i ukrytych błędów, nawet jeśli funkcja gettype() zwróci „integer” lub „double”.

Istnieje jednak różnica pomiędzy używaniem funkcji is_int() i is_numeric(). Pierwsza daje wartość true, gdy parametr jest tylko liczbą całkowitą, druga, gdy jest to dowolna liczba lub ciąg numeryczny (zmienna jest typu „string”, ale zawiera wszystko, co zapewnia zapis matematyczny).

Ten prosty przykład jest dobrym przykładem tego, jak operatory porównania ciągów znaków w PHP („==", „===", „!=", ...) mogą sprawić wiele niespodzianek. Zmienne mogą zmieniać swój typ; nie zawsze są to liczby, ale prawie zawsze można je rzutować na ciąg znaków. W skrajnych przypadkach będzie to pusty ciąg znaków.

W związku z powyższym funkcja porównywania ciągów jest najpopularniejszą w PHP. Decyzja, który z nich wybrać, należy do dewelopera. Dostępnych jest wiele opcji, w tym wyrażenia regularne.

Granice dostępnej funkcjonalności

Porównanie dwóch ciągów znaków w PHP dobrze wykonuje funkcja strpos() - najtańsza, najdokładniejsza i praktyczna opcja. Jeśli funkcja jest liczbą, to jeden ciąg jest zdecydowanie równy drugiemu lub jeden zawiera się w drugim.

Radykalnie przeciwnym, ale także absolutnie poprawnym podejściem jest użycie wyrażeń regularnych.

Jeśli wywołanie funkcji $cResult = scCheckFileName($cStr) zwróci wartość „true”, wówczas ciąg znaków będzie nazwą pliku programu Word. Będzie miał tylko jedną opcję rozszerzenia „.docx” i żadnych symboli w nazwie: tylko litery, cyfry i znaki „_”, „-”.

Funkcję można łatwo przekonwertować na inne typy plików: $cPtr = "/^((4239))\.(html|js|css|png|jpg|docx|txt)(1)$/u". Ta opcja sprawdzania ciągu rozszerza zakres ładowanych ciągów (na przykład w PHP porównywanie ciągów służy „w celu przesłania plików na serwer, bez najmniejszej szansy na błąd wejścia”) do HTML, js, css, .. .

Używanie strpos() i preg_match() to skrajności. Nie są one bezpośrednio związane z kwestią porównania terminów. Ale kwestia algorytmu polega na zastosowaniu kombinacji stylów, wykorzystaniu wszystkich możliwości, aby osiągnąć niezawodny i poprawny wynik.

Funkcjonalność PHP: porównywanie ciągów

Arsenał porównywania ciągów w tym języku obejmuje nie tylko funkcje czystego porównywania, ale także kombinację z bezpośrednim wyszukiwaniem lub zamianą. Działanie nie zawsze musi być takie samo jak porównanie, ponieważ to drugie niekoniecznie zmienia jakikolwiek wiersz. Często trzeba wybrać jedną lub drugą gałąź algorytmu.

Zwykła wersja PHP: porównanie ciągów jest wykonywane przez funkcję int strcmp (s1, s2).

Wynik funkcji:

  • 0 - ciągi są równe;
  • -1 - pierwsza linia jest mniejsza niż druga;
  • 1 - pierwsza linia jest większa niż druga.

W praktyce oznacza to, że pierwszy ciąg znaków jest zawarty w drugim, na podstawie którego funkcja PHP (porównanie ciągów) podejmuje decyzję. Bardziej ograniczony wariant strpos(), ponieważ w tym drugim przypadku może być znane położenie wystąpienia.

W funkcji strcmp() rozróżniana jest wielkość liter. Jeśli chcesz porównać ciągi znaków bez uwzględniania wielkości liter, PHP sugeruje użycie strcasecmp(). Składnia jest podobna.

W praktyce często konieczna jest praca nie z całym ciągiem, a jedynie z jego częścią. Aby to zrobić, zestaw funkcji PHP (porównanie ciągów) zawiera strncmp (s1, s2, N). Trzeci parametr określa, że ​​porównywane jest tylko N bajtów. Wynik jest taki sam jak strcmp().

Tablice, ciągi i porównanie

Dane są prawie zawsze reprezentowane jako ciągi znaków. Jeśli weźmiemy pod uwagę tablice, obiekty lub struktury informacyjne, to są to po prostu różne kombinacje prostszych struktur łańcuchowych.

Tablice ciągów i ciągi znaków można reprezentować w sposób uzupełniający. Przekształcanie tablicy w ciąg znaków za pomocą funkcji implode(array, symbol), na przykład: $margins1 = implode(", ", $style->getInnerMargin()); ...praca algorytmu/użytkownika...; $margins2 = implode(", ", $style->getInnerMargin()) umożliwia połączenie wszystkich pozycji obiektów w ciąg pozycji.

Następnie możesz wykonać porównanie ciągów PHP i za jednym razem: $check = strcmp ($margins1, $margins2) i upewnić się, że algorytm lub użytkownik coś zmienił (lub nie). Jeśli wykonasz porównanie w zwykły sposób, będziesz musiał iterować po elementach tablic. Trwa to dłużej i wygląda bardziej uciążliwie.

Obiekty i ciągi

Jeszcze potężniejsze wykorzystanie PHP (porównanie ciągów) można wdrożyć poprzez pomysły obiektowe.

Współczesna koncepcja obiektów zakłada, że ​​posiadają one właściwości i metody. Te pierwsze są zwykle reprezentowane przez liczby, ciągi znaków, tablice i inne obiekty. Te ostatnie często obejmują metody zapisywania (wstawiania) do łańcucha i odtwarzania z ciągu (get).

W przeciwieństwie do tablic obiekt działa na podstawie własnych właściwości i wchodzi w interakcję z innymi obiektami. Obiekt jest „kompetentny” w tym, jakie jego właściwości mają realne znaczenie dla algorytmu, programu jako całości.

Punkt ten stanowi podstawę i możliwość, podczas nagrywania, zapisywania w linii tylko niezbędnych informacji, a podczas przywracania z linii przywracania wszystkich właściwości roboczych do pożądanego stanu. Zwykle każdy obiekt zawiera istotne i operacyjne (tymczasowe) informacje. Realizacja tego pomysłu pozwala zaoszczędzić nie tylko pamięć, miejsce na dysku i rekordy bazy danych, ale także umożliwia porównywanie ciągów za pomocą prostszych i dokładniejszych środków.

Składnia i semantyka

PHP dynamicznie się rozwija, a jego funkcjonalność, zarówno w zakresie porównywania ciągów, jak i ich przetwarzania, jest stale udoskonalana. Nic jednak nie stoi na przeszkodzie, aby deweloper przesunął środek ciężkości w obszar semantyki.

Niewątpliwie funkcjonalność jest dobra, ale jej użycie można przenieść na semantyczną część kodu, na obiekty. Kiedy algorytm jest przedstawiany jako system interakcji obiektów, wygląda to znacznie lepiej niż sekwencja porównań i działań w prostym, sekwencyjnym, klasycznym stylu.

W tym rozdziale opisano operatory porównania. Operatory te sprawdzają równość (np. równą, mniejszą, identyczną równą itp.) pomiędzy dwiema wartościami i zwracają prawdę lub fałsz w zależności od powiązania operandów. Operatory porównania zawsze zwracają wartości logiczne, a wartości te najczęściej wykorzystuje się w instrukcjach takich jak , while czy for w celu kontrolowania przebiegu wykonywania programu.

Operatory porównania
PrzykładNazwaWynik
$i == $yRównePRAWDA, jeśli $i jest równe $y po konwersji typu danych.
$i === $yIdentyczniePRAWDA, jeśli $i jest równe $y i ma ten sam typ danych.
$i!= $yNie równe
$tj<>$yNie równePRAWDA, jeśli $i nie jest równe $y po konwersji typu danych.
$i!== $yNie identycznePRAWDA, jeśli $i nie jest równe $y lub są one różnych typów.
$tj< $y MniejPRAWDA, jeśli $i jest mniejsze niż $y.
$i > $yWięcejPRAWDA, jeśli $i jest ściśle większe niż $y.
$tj<= $y Mniejsze lub równePRAWDA, jeśli $i jest mniejsze lub równe $y.
$i >= $yWiększe lub równePRAWDA, jeśli $i jest większe lub równe $y.

Uwaga: jeśli spróbujesz wyświetlić wynik porównania na ekranie, wartość true zostanie wyświetlona w oknie przeglądarki jako 1. Wartość false odpowiada liczbie 0 i nie jest wyświetlana na ekranie (w zasadzie warto o tym pamiętać z opisu typu boolowskiego). Jeśli chcesz, aby wynik był prawdziwy lub fałszywy, użyj funkcji var_dump().

Warto też zauważyć: jeśli porównywany będzie ciąg znaków z liczbą lub dwa ciągi znaków zawierające liczby, każdy ciąg zostanie zamieniony na liczbę, a one zostaną porównane jako liczby.

Operator == (równości)

Operator == (równość) akceptuje operandy dowolnego typu; jeśli oba operandy są równe, zwraca wartość true, w przeciwnym razie zwraca wartość false.

Jeśli operandy są różnych typów danych, PHP spróbuje je przekonwertować na ten sam typ danych przed ich porównaniem, na przykład wyrażenie „4” == 4 zwróci wartość true, ponieważ PHP automatycznie rzuci porównywane wartości ten sam typ danych. Podobnie wyrażenie $a == 1 zwróci wartość true, jeśli zmienna $a zawiera wartość 1. Jeśli chcesz uniknąć niejawnej konwersji typów podczas porównywania, powinieneś użyć operatora tożsamości, co zostanie omówione później.

Operator === (tożsamości)

Operator === (tożsamość) akceptuje operandy dowolnego typu i zwraca wartość true, jeśli ich wartości są takie same (równe), oraz false, jeśli są różne. Czym różni się od operatora równości? Operator tożsamości testuje dwa operandy pod kątem „tożsamości” w oparciu o ścisłą definicję dopasowania, co oznacza, że ​​oprócz tego, że wartości samych operandów są równe, muszą one również należeć do tego samego typu danych. Jako przykład rozważmy wyrażenie takie jak 5 === "5" , wynik tego wyrażenia będzie fałszywy, ponieważ wartość po lewej stronie jest liczbą, a wartość po prawej stronie jest ciągiem znaków, czyli tymi wartościami mają różne typy danych. Pamiętaj, że operatory == i === oznaczają „równy” i „identyczny/identycznie równy”.

Operator != lub<>(nierówności)

Operator nierówności ma dwa typy: != i<>. Jest przeciwieństwem operatora == i zwraca wartość true, jeśli operandy nie są równe. Operator nierówności zwraca fałsz tylko wtedy, gdy wartości po obu jego stronach są sobie równe.

$zmienna2); // zwróć fałszywy var_dump("Dom"<>"dom"); // zwrócenie prawdy?>

Operator !== (nietożsamość)

Operator !== (nieidentyczności) działa dokładnie odwrotnie niż operator ===. Zwraca wartość true, jeśli wartości argumentów nie są sobie równe lub nie są tego samego typu danych. Jako przykład rozważmy następujące wyrażenie: 7 !== "7" , operator "nietożsamości" zwróci wartość true, ponieważ wartość po lewej stronie jest liczbą, a wartość po prawej stronie jest ciągiem znaków, co oznacza, że ​​są one różne typy danych. Stąd łatwo będzie zapamiętać, że operatory != i !== oznaczają „nie równe” i „nie identyczne/identyczne nie równe”.

Operator > (więcej)

W przypadku użycia operatora > (większego niż) porównanie zwraca wartość true tylko wtedy, gdy wartość po lewej stronie operatora jest większa niż wartość po jego prawej stronie. Podobnie jak inne operatory, operator > działa nie tylko z wartościami liczbowymi, ale także z wartościami łańcuchowymi. Ale jak jedna linia może być większa od drugiej?

Podczas pracy z ciągami znaków mała litera jest większa niż wielka litera. Podczas porównywania ciągów PHP najpierw sprawdza pierwszą literę ciągu pod kątem niezgodności. Jeśli nie zostanie znaleziona żadna różnica, przechodzi do następnego znaku i tak dalej, aż do znalezienia różnicy lub osiągnięcia końca wiersza. Jeśli dwie wartości po obu stronach operatora > są równe, operator również zwróci false .

3); // zwróć true var_dump("Cześć" > "cześć"); // zwróć fałsz var_dump(1 > 1); // zwróć fałsz?>

Operator< (меньше)

Operator< (меньше ) является функциональной противоположностью оператора «больше». Он возвращает true , когда значение слева от него меньше значения, находящегося справа, и false , если значение левого операнда больше правого или значения равны.

Operator >= (większy lub równy)

Operator >= ( większy lub równy) różni się nieco od omówionych wcześniej operatorów porównania. Dodaje możliwość, aby dwie wartości po obu stronach były równe, to znaczy, aby wartość true została zwrócona, wartość po lewej stronie operatora musi być większa lub równa wartości po prawej stronie. Operator większy lub równy zwraca fałsz tylko wtedy, gdy wartość po jego lewej stronie jest mniejsza niż wartość po prawej stronie.

= 5); // zwróć true var_dump("cześć" >= "cześć"); // zwróć prawdę var_dump(1 >= 2); //zwróć fałsz?>

Operator<= (mniejszy lub równy)

Operator<= (меньше или равно) похож на оператор «больше или равно». Чтобы оператор <= вернул true , значение слева от оператора должно быть меньше или равно значению справа от него. Он возвращает false , только если значение слева от него больше, чем значение справа.

Porównuje ciągi.

Składnia:

Int strcmp(string str1, string str2)

substr_compare()

Bezpieczne binarnie porównanie 2 ciągów znaków z przesunięciem, rozróżnianiem i nieuwzględnianiem wielkości liter (PHP 5)

Opis:

Int substr_compare (string main_str, string str, int offset [, int długość [, bool wielkość_wielkości]])

substr_compare() porównuje ciąg main_str, zaczynając od znaku określonego przez argument offset, z ciągiem str. Porównanie obejmuje maksymalną długość znaków.

Zwraca liczbę 0, jeśli jest większa niż str, i 0, jeśli ciągi znaków są równe. Jeśli długość jest większa lub równa długości main_str i przekazano offset, substr_compare() generuje ostrzeżenie i zwraca FALSE.

Jeśli wielkość liter ma wartość TRUE, w porównaniu uwzględniana jest wielkość liter.

Przykład użycia substr_compare()

echo substr_compare("abcde", "bc", 1, 2); // 0
echo substr_compare("abcde", "bcg", 1, 2); // 0
echo substr_compare("abcde", "BC", 1, 2, prawda); // 0
echo substr_compare("abcde", "bc", 1, 3); // 1
echo substr_compare("abcde", "cd", 1, 2); // -1
echo substr_compare("abcde", "abc", 5, 1); // ostrzeżenie
?>

Porównuje początki ciągów.
Składnia:

Int strncmp(string str1, string str2, int len)

Funkcja ta różni się od strcmp() tym, że porównuje nie całe słowo, ale pierwszą długość bajtów. Jeśli len jest mniejszy niż długość najmniejszego ciągu, porównywane są całe ciągi.
Ta funkcja porównuje dwa ciągi znak po znaku (dokładniej bajt-bajt) i zwraca:

0 - jeśli ciągi są całkowicie zgodne;

1 - jeśli ciąg znaków str1 jest leksykograficznie mniejszy od str2;

1 - jeśli wręcz przeciwnie, str1 jest „większy” niż str2.

Ponieważ porównanie odbywa się bajt po bajcie, wielkość liter ma wpływ na wyniki porównań.

strcasecmp

Porównuje ciągi znaków w sposób nieuwzględniający wielkości liter.
Składnia:

Int strcasecmp(string str1, string str2)

To samo co strcmp(), z tą różnicą, że nie uwzględnia wielkości liter.

$str1 = "Witam!";
$str2 = "cześć!";
if(!strcesecmp($str1, $str2))
echo "$str1 == $str2 podczas porównywania ciągów znaków bez rozróżniania wielkości liter";

strncasecmp

Porównuje początki ciągów w sposób nieuwzględniający wielkości liter.
Składnia:

Int strncasecmp(string str1, string str2, int len)

Funkcja strncasecmp() jest kombinacją funkcji strcasecmp() i strncmp().

strnatcmp

Wykonuje „naturalne” porównanie ciągów.
Składnia:

Int strnatcmp(string str1, string str2)

Ta funkcja symuluje porównanie ciągów znaków, którego użyłby człowiek.

$arr1 = $arr2 = tablica("img12.png", "img10.png", "img2.png", "img1.png");
echo "Normalne sortowanie";
usort($arr1, "strcmp");
print_r($arr1);
echo "nNaturalne sortowanie";
usort($arr2, "strnatcmp");
print_r($arr2);

Ten skrypt wyświetli następujące informacje:

Normalna tablica sortowania(
=> img1.png
=> img10.png
=> img12.png
=> img2.png
)

Sortowanie naturalne(
=> img1.png
=> img2.png
=> img10.png
=> img12.png
)

strnatcasecmp

Wykonuje „naturalne” porównanie ciągów znaków bez uwzględniania wielkości liter.
Składnia:

Int strnatcasecmp(string str1, string str2)

To samo co strnatcmp(), ale ignoruje wielkość liter.

podobny_tekst

Określa podobieństwo dwóch ciągów znaków.
Składnia:

Int podobny_tekst(najpierw ciąg znaków, drugi ciąg [, podwójny procent])

Funkcja podobny_tekst() oblicza podobieństwo dwóch ciągów znaków przy użyciu algorytmu opisanego przez Olivera.
Ale zamiast stosu (jak w pseudokodzie Olivera) używa wywołań rekurencyjnych.
Złożoność algorytmu powoduje, że funkcja jest powolna, a jej prędkość jest proporcjonalna do (N^3), gdzie N jest długością największego ciągu.
Funkcja zwraca liczbę pasujących znaków w obu ciągach. Przekazując trzeci opcjonalny parametr przez referencję, przechowuje procent dopasowań ciągu.

Levenshtein

Wyznaczanie różnicy Levenshteina dwóch strun.
Składnia:

Int levenshtein(string str1, string str2)
int levenshtein(string str1, string str2, int koszt_ins, int koszt_rep, int koszt_del)
int levenshtein(string str1, string str2, koszt funkcji)

Różnica Levenshteina to minimalna liczba znaków, które należy zastąpić, wstawić lub usunąć, aby zamienić str1 w str2. Złożoność algorytmu jest proporcjonalna do iloczynu długości ciągów str1 i str2, co sprawia, że ​​funkcja jest szybsza niż podobna_tekst().

Pierwsza forma funkcji zwraca liczbę operacji znakowych wymaganych do przekształcenia str1 w str2.

Druga forma ma trzy dodatkowe parametry: koszt operacji wstawiania, zastępowania i usuwania, co czyni ją bardziej przydatną do obliczeń, ale jednocześnie mniej szybką. Zwracany jest całkowy wskaźnik złożoności transformacji.
Trzecia opcja pozwala na określenie funkcji użytej do obliczenia złożoności transformacji.
Funkcja kosztu wywoływana jest z następującymi argumentami:

zastosowana operacja (wstaw, zmień, usuń): „I*, „R”, „D”;

rzeczywisty znak pierwszego wiersza

rzeczywisty znak drugiej linii

pozycja liniowa 1

pozycja liniowa 2

pozostała długość linii 1

pozostała długość linii 2

Wywoływana funkcja będzie musiała zwrócić koszt tej operacji.
Jeśli jeden z ciągów jest dłuższy niż 255 znaków, levenshtein() zwraca -1.
ale ta długość jest więcej niż wystarczająca.

strcoll()

Porównaj ciągi znaków w oparciu o bieżące ustawienia regionalne (PHP 4 >= 4.0.5, PHP 5)

Opis:

Int strcoll (string str1, string str2)

Zwraca liczbę dodatnią, jeśli str1 jest mniejsza niż str2; liczba ujemna, jeśli str1 jest większa niż str2 i 0, jeśli ciągi są równe. strcoll() podczas porównywania używa ustawień bieżących ustawień regionalnych. Jeśli ustawienia regionalne to C lub POSIX, ta funkcja działa tak samo jak strcmp().

Należy pamiętać, że w tej funkcji rozróżniana jest wielkość liter i w przeciwieństwie do funkcji strcmp() nie jest ona bezpieczna w trybie binarnym.



Jeśli zauważysz błąd, zaznacz fragment tekstu i naciśnij Ctrl+Enter
UDZIAŁ: