Hướng dẫn string diff php - chuỗi khác biệt php

(PHP 5 >= 5.3.0, PHP 7)

Nội dung chính

  • Dạng hướng đối tượng
  • Dạng hướng thủ tục
  • Các tham số
  • Giá trị trả về
  • Sử dụng toán tử so sánh
  • Sử dụng hàm strcmp()
  • Sử dụng hàm similar_text
  • Sử dụng hàm levenshtein
  • Sử dụng hàm soundex
  • Sử dụng hàm metaphone
  • References:

DateTime::diff -- DateTimeImmutable::diff -- DateTimeInterface::diff -- date_diff — Trả về sự khác nhau giữa 2 đối tượng DateTime.

Dạng hướng đối tượng

Dạng hướng thủ tụcDateTime::diff ( DateTimeInterface 

bool(false)
bool(true)
bool(false)
2 [, bool 
bool(false)
bool(true)
bool(false)
3 = 
bool(false)
bool(true)
bool(false)
4
 ] )

Các tham sốDateTimeImmutable::diff ( DateTimeInterface 

bool(false)
bool(true)
bool(false)
2 [, bool 
bool(false)
bool(true)
bool(false)
3 = 
bool(false)
bool(true)
bool(false)
4
 ] )

Giá trị trả vềDateTimeInterface::diff ( DateTimeInterface 

bool(false)
bool(true)
bool(false)
2 [, bool 
bool(false)
bool(true)
bool(false)
3 = 
bool(false)
bool(true)
bool(false)
4
 ] )

Dạng hướng thủ tục

Các tham số

bool(false)
bool(true)
bool(false)
4 ] )

Giá trị trả về

Các tham số

5

Giá trị trả về

6

Sử dụng toán tử so sánh

Giá trị trả về

Sử dụng toán tử so sánh

bool(false)
bool(true)
bool(false)
4 nếu có lỗi.

Sử dụng hàm strcmp()

Sử dụng hàm similar_textDateTime::diff()

Dạng hướng đối tượng


  $input = 0;
  if('defaultpassword' == $input){
   echo 'true';
  } else {
   echo 'false';
  }
?>
8

Dạng hướng thủ tục


  $input = 0;
  if('defaultpassword' == $input){
   echo 'true';
  } else {
   echo 'false';
  }
?>
9

Các tham số

+2 days

Giá trị trả vềDateTime

Sử dụng toán tử so sánh:

Sử dụng hàm strcmp()

 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
0

 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
1

Sử dụng hàm similar_text

bool(false)
bool(true)
bool(false)

Sử dụng toán tử so sánh

Cách đơn giản và thô sơ nhất là dùng toán tử so sánh của PHP (comparison operators). Tuy nhiên không nên dùng toán tử Equal (

 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
2) mà nên dùng toán tử Identical (
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
3). Bởi vì
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
2 không so sánh kiểu dữ liệu và có thể dẫn đến sai lệch trong việc so sánh. Ta hãy xem thử ví dụ sau:

Nội dung chính

  • Sử dụng toán tử so sánh
  • Cách đơn giản và thô sơ nhất là dùng toán tử so sánh của PHP (comparison operators). Tuy nhiên không nên dùng toán tử Equal (
     
    
    $input = 0;
    echo ('defaultpassword' == $input) ? true : false;
    ?>
    2) mà nên dùng toán tử Identical (
     
    
    $input = 0;
    echo ('defaultpassword' == $input) ? true : false;
    ?>
    3). Bởi vì
     
    
    $input = 0;
    echo ('defaultpassword' == $input) ? true : false;
    ?>
    2 không so sánh kiểu dữ liệu và có thể dẫn đến sai lệch trong việc so sánh. Ta hãy xem thử ví dụ sau:
  • Nội dung chính
  • Sử dụng hàm levenshtein
  • Sử dụng hàm soundex
  • Sử dụng hàm metaphone
  • References:

  $input = 0;
  if('defaultpassword' == $input){
   echo 'true';
  } else {
   echo 'false';
  }
?>

Theo PHP document thì hàm này tương tự như soundex nhưng chính xác hơn vì dựa vào nguyên tắc phát âm cơ bản trong tiếng Anh. Và hàm này trả về một khóa có chiều dài thay đổi theo chiều dài của chuỗi đầu vào. Thuật toán này được phát triển bởi Lawrence Philips và được mô tả trong cuốn “Practical Algorithms for Programmers”, Binstock & Rex, Addison Wesley, 1995.

 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>

bool(false)
bool(true)
bool(false)
1

Trong khi dùng hàm soundex sẽ trả về 2 kết quả khác nhau

 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
4 (Catherine) và
 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
5 (Katherine). Ở đây ta có thể thấy tại sao hàm
 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
6 được mô tả là chính xác hơn hàm
 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
7, theo nghĩa nó có ích hơn vì trên thực tế hai Katherine và Catherine đọc hoàn toàn giống nhau. Cũng tương tự như
 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
7, ta có thể sử dụng hàm
 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
6 để tăng khả năng tìm kiếm trong database.

Tham khảo một bài viết áp dụng với Python

PHP String Comparison == vs strcmp, Stackoverflow

 

echo ('1e3' === '1000') ? 'true' : 'false';
?>

what is the difference between “some” == “some\0” and strcmp(“some”,“some\0”) in c++?, Stackoverrflow

Cách đơn giản và thô sơ nhất là dùng toán tử so sánh của PHP (comparison operators). Tuy nhiên không nên dùng toán tử Equal ( 2) mà nên dùng toán tử Identical ( 3). Bởi vì 2 không so sánh kiểu dữ liệu và có thể dẫn đến sai lệch trong việc so sánh. Ta hãy xem thử ví dụ sau:

Nội dung chính

  1. Sử dụng hàm strcmp()
  2. Sử dụng hàm similar_text
  3. Viết ngắn sử dụng toán tử 3 ngôi (ternary operator):

Mặc dùng

 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
5 và
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
6 hoàn toàn khác nhau nhưng kết quả trả về là
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
7 thay vì
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
8. Bởi vì khi PHP sẽ ngầm định ép kiểu về
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
9 để so sánh, và ép kiểu chuỗi ‘defaultpassword’ về kiểu float thì nó sẽ ra kết quả như sau:
 

echo ('1e3' == '1000') ? 'true' : 'false';
?>
0 Xem thêm

Do đó khi so sánh 2 chuỗi

 

echo ('1e3' == '1000') ? 'true' : 'false';
?>
1 và
 

echo ('1e3' == '1000') ? 'true' : 'false';
?>
2 bằng phép toán
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
2 ta được kết quả là true.

 

echo ('1e3' == '1000') ? 'true' : 'false';
?>

 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12

Mặc dù nó vẫn bung ra Warning như nó vẫn vượt qua vào được bên trong và in ra câu thông báo:”You successfully logged in”

Sử dụng hàm similar_text

 

echo ('1e3' === '1000') ? 'true' : 'false';
?>
8

Hàm similar_text nhận 3 tham số, 2 chuỗi đầu vào và một biến chứa kết quả trả về. Kết quả là số phần trăm giống nhau giữa hai chuỗi. Ví dụ:

 

similar_text("Hello World","Hello Hello",$percent);
echo $percent;
?>

Kết quả trả về là

 

echo ('1e3' === '1000') ? 'true' : 'false';
?>
9 Theo document của PHP, hàm này tính toán sự giống nhau giữa hai chuỗi được được mô tả trong sách Programming Classics: Implementing the World’s Best Algorithms by Oliver (ISBN 0-131-00413-1).

Tuy nhiên thứ tự của các tham số cũng khiến thay đổi kết quả trả về, và ví dụ dưới đây được báo cáo là một bug nhưng chưa được xác nhận

 

echo similar_text('test','wert'); // 1
echo similar_text('wert','test'); // 2 hay
$var_1 = 'PHP IS GREAT'; 
$var_2 = 'WITH MYSQL'; 

echo similar_text($var_1, $var_2); // 3
echo similar_text($var_2, $var_1); // 2
?>

Sử dụng hàm levenshtein

Hàm này ngược lại với hàm

 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
0, nó sẽ trả về 0 nếu như hai chuỗi so sánh giống hệt nhau:

 
 
int levenshtein ( string $str1 , string $str2 )
int levenshtein ( string $str1 , string $str2 , int $cost_ins , int $cost_rep , int $cost_del ) 
?>

Hàm này tính khoảng cách levenshtein (hay còn gọi là Edit distance) giữa 2 dãy (sequence) và được đặt tên theo một nhà khoa học người Nga Vladimir Levenshtein người đã nghĩ ra ý tưởng này vào năm 1965. Khoảng cách levenshtein được tính bằng cách tính số lần xóa (deletions), thêm (insertions) và thay thế (substitutions) để chuyển chuỗi gốc (source) thành chuỗi đích (target).

Ví dụ: Khoảng cách Levenshtein giữa 2 chuỗi “kitten” và “sitting” là 3, vì phải dùng ít nhất 3 lần biến đổi.

  • kitten -> sitten (thay “k” bằng “s”)
  • sitten -> sittin (thay “e” bằng “i”)
  • sittin -> sitting (thêm kí tự “g”)
bool(false)
bool(true)
bool(false)
0

Sử dụng hàm soundex

 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
1

Hàm này sử dụng thuật toán ngữ âm (phonetic algorithm) để tính toán chỉ mục của các tự dựa trên cách phát âm của nó (theo tiếng Anh). Hàm này trả về một chuỗi 4 ký tự bắt đầu với một chữ cái. Thuật toán này được mô tả trong cuốn nổi tiếng The Art Of Computer Programming, vol. 3: Sorting And Searching”, Addison-Wesley (1973), pp. 391-392 của Donald Knuth.

Ví dụ: Trong MySQL có một hàm tương tự soundex. Ta có thể dùng hàm này để đưa ra tìm không gần đúng một keyword. Ta lưu trong database 1 trường soundex, để so sánh với keyword người dùng đưa vào:

 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
2

Sử dụng hàm metaphone

 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
3

Theo PHP document thì hàm này tương tự như soundex nhưng chính xác hơn vì dựa vào nguyên tắc phát âm cơ bản trong tiếng Anh. Và hàm này trả về một khóa có chiều dài thay đổi theo chiều dài của chuỗi đầu vào. Thuật toán này được phát triển bởi Lawrence Philips và được mô tả trong cuốn “Practical Algorithms for Programmers”, Binstock & Rex, Addison Wesley, 1995.

bool(false)
bool(true)
bool(false)
1

Trong khi dùng hàm soundex sẽ trả về 2 kết quả khác nhau

 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
4 (Catherine) và
 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
5 (Katherine). Ở đây ta có thể thấy tại sao hàm
 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
6 được mô tả là chính xác hơn hàm
 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
7, theo nghĩa nó có ích hơn vì trên thực tế hai Katherine và Catherine đọc hoàn toàn giống nhau. Cũng tương tự như
 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
7, ta có thể sử dụng hàm
 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
6 để tăng khả năng tìm kiếm trong database.

Tham khảo một bài viết áp dụng với Python

References:

  • PHP String Comparison == vs strcmp, Stackoverflow
  • what is the difference between “some” == “some\0” and strcmp(“some”,“some\0”) in c++?, Stackoverrflow
  • PHP Manual, metaphone
  • PHP Manual, similar_text
  • PHP Manual, levenshtein