Một số hàm có chức năng tương tự nhau giữa PHP và JavaScript

Bài viết dưới đây sẽ tổng hợp một số hàm phổ biến có chức năng tương tự nhau giữa hai ngôn ngữ lập trình: PHP và JavaScript (JS).

Việc nắm rõ các hàm built-in của cả hai ngôn ngữ sẽ giúp việc coding trở nên linh hoạt hơn.

Đồng thời, việc phân biệt giữa cách sử dụng những hàm này sẽ tránh những nhầm lẫn không đáng có.

Các hàm thao tác với chuỗi

Tách chuỗi thành một mảng

Nếu như trong PHP, hàm đầu tiên có thể nghĩ tới là explode(), thì trong JS, hàm tương ứng sẽ là split() .

explode()

$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

split()

const str = 'The quick brown fox jumps over the lazy dog.';

const words = str.split(' ');
console.log(words[3]);
// expected output: "fox"

Khớp một biểu thức chính quy

preg_match()

// The "i" after the pattern delimiter indicates a case-insensitive search
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}

match()

const paragraph = 'The quick brown fox jumps over the lazy dog. It barked.';
const regex = /[A-Z]/g;
const found = paragraph.match(regex);

console.log(found);
// expected output: Array ["T", "I"]

Có thể thấy, dù thực hiện cùng một chức năng, nhưng kết quả trả về giữa hai hàm trên là khác nhau.

preg_match(): trả về 1 nếu khớp với pattern, 0 nếu không khớp và FALSE nếu có lỗi xảy ra.

match(): trả về chuỗi khớp với pattern và NULL nếu không có chuỗi thoản mãn.

Tương tự, cũng sẽ có cặp hàm tương ứng preg_match_allmatchAll()

Lấp đầy chuỗi (pad a string) theo độ dài cho trước

str_pad()

$input = "Alien";
echo str_pad($input, 10);                      // produces "Alien     "
echo str_pad($input, 10, "-=", STR_PAD_LEFT);  // produces "-=-=-Alien"
echo str_pad($input, 10, "_", STR_PAD_BOTH);   // produces "__Alien___"
echo str_pad($input,  6, "___");               // produces "Alien_"
echo str_pad($input,  3, "*");                 // produces "Alien"

padStart(), padEnd(),

const str1 = '5';

console.log(str1.padStart(2, '0'));
// expected output: "05"

const fullNumber = '2034399002125581';
const last4Digits = fullNumber.slice(-4);
const maskedNumber = last4Digits.padStart(fullNumber.length, '*');

console.log(maskedNumber);
// expected output: "************5581"

const str1 = 'Breaded Mushrooms';

console.log(str1.padEnd(25, '.'));
// expected output: "Breaded Mushrooms........"

const str2 = '200';

console.log(str2.padEnd(5));
// expected output: "200  "

Thay vì có một đối số pad_type - quy định pad về bên trái hay bên phải như hàm str_pad() của PHP, sẽ có hai hàm tương ứng với từng kiểu padding trong JS.

Tìm vị trí xuất hiện đầu tiên của chuỗi cần tìm trong chuỗi cho trước

strpos()

$mystring = 'abc';
$findme   = 'a';
$pos = strpos($mystring, $findme);

// Note our use of ===.  Simply == would not work as expected
// because the position of 'a' was the 0th (first) character.
if ($pos === false) {
    echo "The string '$findme' was not found in the string '$mystring'";
} else {
    echo "The string '$findme' was found in the string '$mystring'";
    echo " and exists at position $pos";
}

indexOf()

const paragraph = 'The quick brown fox jumps over the lazy dog. If the dog barked, was it really lazy?';

const searchTerm = 'dog';
const indexOfFirst = paragraph.indexOf(searchTerm);

console.log('The index of the first "' + searchTerm + '" from the beginning is ' + indexOfFirst);
// expected output: "The index of the first "dog" from the beginning is 40"

console.log('The index of the 2nd "' + searchTerm + '" is ' + paragraph.indexOf(searchTerm, (indexOfFirst + 1)));
// expected output: "The index of the 2nd "dog" is 52"

Một lưu ý tiếp theo về sự khác nhau giữa dữ liệu trả về của hai hàm trên.

Khi không có chuỗi cần tìm:

Hàm strpos(): trả về giá trị FALSE. Do đó, cần tránh nhầm lẫn với giá trị 0

Hàm indexOf(): trả về giá trị -1.

Một số cặp hàm xử lý chuỗi khác

PHP JavaScript
str_repeat() repeat()
str_replace() replace()
strtolower() toLowerCase()
strtoupper() toUpperCase()

Các hàm thao tác với mảng

Đếm số lượng phần tử của mảng

Một trong những bài toàn thường gặp nhất ở bất kỳ ngôn ngữ lập trình nào.

count()

$a[0] = 1;
$a[1] = 3;
$a[2] = 5;
var_dump(count($a));  // 3

$b[0]  = 7;
$b[5]  = 9;
var_dump(count($b));  // 2

length

const clothing = ['shoes', 'shirts', 'socks', 'sweaters'];

console.log(clothing.length);
// expected output: 4

Trong trường hợp của JS, có thể đếm số lượng phần tử mảng dựa vào thuộc tính length , thay vì lời gọi hàm.

Nối các phần tử của mảng thành một chuỗi

implode()

$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);

echo $comma_separated; // lastname,email,phone

// Empty string when using an empty array:
var_dump(implode('hello', array())); // string(0) ""

join()

const elements = ['Fire', 'Air', 'Water'];

console.log(elements.join());
// expected output: "Fire,Air,Water"

console.log(elements.join(''));
// expected output: "FireAirWater"

console.log(elements.join('-'));
// expected output: "Fire-Air-Water"

Hàm implode() có một alias join(), có tên giống với hàm join() trong JS.

Gộp hai mảng vào nhau

array_merge()

$array1 = array(1, 2, 4);
$array2 = array(4, 5);
$result = array_merge($array1, $array2);
print_r($result);
/** expected result
Array
(
    [0] => 1
    [1] => 2
    [2] => 4
    [3] => 4
    [4] => 5
)
**/

concat()

const array1 = ['a', 'b', 'c'];
const array2 = ['d', 'e', 'f'];
const array3 = array1.concat(array2);

console.log(array3);
// expected output: Array ["a", "b", "c", "d", "e", "f"]

Hàm array_merge() sẽ có kết quả tương đương với hàm concat() trong trường hợp mảng đầu vào chỉ có key dạng số.

Đối với mảng có key dạng chuỗi, phần tử của mảng bị trùng key sẽ bị ghi đè.

Xác định giá trị cho trước có tồn tại trong mảng

in_array()

<?php
$os = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $os)) {
    echo "Got Irix";
}
if (in_array("mac", $os)) {
    echo "Got mac";
}
?>

// expected result: Got Irix

includes()

const array1 = [1, 2, 3];

console.log(array1.includes(2));
// expected output: true

const pets = ['cat', 'dog', 'bat'];

console.log(pets.includes('cat'));
// expected output: true

console.log(pets.includes('at'));
// expected output: false

Mặc định cả hai hàm trên đều phân biệt hoa thường khi tìm kiếm.

Tìm vị trí xuất hiện đầu tiên của phần tử cần tìm trong chuỗi cho trước

array_search()

$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');

$key = array_search('green', $array); // $key = 2;
$key = array_search('red', $array);   // $key = 1;

indexOf()

const beasts = ['ant', 'bison', 'camel', 'duck', 'bison'];

console.log(beasts.indexOf('bison'));
// expected output: 1

// start from index 2
console.log(beasts.indexOf('bison', 2));
// expected output: 4

console.log(beasts.indexOf('giraffe'));
// expected output: -1

Chú ý:

Hàm array_search(): trả về giá trị FALSE khi không tìm thấy phần tử tương ứng. Do đó, cũng cần lưu ý để tránh nhầm với trường hợp giá trị trả về là 0 (phần tử đầu tiên trong mảng).

Hàm array_search() mặc định so sánh sử dụng loose comparison ==.

Hàm indexOf(): trả về giá trị -1 khi không tìm thấy phần tử trong mảng. Hàm này chỉ sử dụng strict comparison ===.

Cả hai hàm trên đều phân biệt hoa thường.

Sắp xếp mảng theo hàm tự định nghĩa

usort()

function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

$a = array(3, 2, 5, 6, 1);

usort($a, "cmp");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}

// expected result
/**
0: 1
1: 2
2: 3
3: 5
4: 6
**/

sort()

var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
  return a - b;
});
console.log(numbers);

// [1, 2, 3, 4, 5]

Một số cặp hàm xử lý mảng khác

PHP JavaScript
array_filter() filter()
array_keys() keys()
array_map() map()
array_push() push()
array_pop() pop()
array_reduce() reduce()
array_reverse() reverse()
array_shift() shift()
array_slice() slice()
array_splice() splice()

Tổng hợp chung các hàm đã điểm qua

PHP JavaScript
String
explode() split()
preg_match() match()
str_pad() padStart(), padEnd()
strpos() indexOf()
str_repeat() repeat()
str_replace() replace()
strtolower() toLowerCase()
strtoupper() toUpperCase()
Array
count() length
implode() join
array_merge() concat()
in_array() includes()
array_search() indexOf()
usort() sort()
array_filter() filter()
array_keys() keys()
array_map() map()
array_push() push()
array_pop() pop()
array_reduce() reduce()
array_reverse() reverse()
array_shift() shift()
array_slice() slice()
array_splice() splice()

Như một lẽ dĩ nhiên, không phải lúc nào cũng có cặp hàm tương ứng trong hai ngôn ngữ lập trình. Một số hàm có tồn tại ở PHP, nhưng lại không có ở JS và ngược lại. Chính vì lẽ đó, một vài thư viện ra đời để góp phần giải quyết vấn đề này.

Thư viện JS có thể kể đến trong việc hỗ trợ tích hợp các hàm của PHP: kvz/locutus (https://locutus.io/)

Ở chiều ngược lại, gần như các hàm của JS đều có thể được hỗ trợ bởi PHP. Với framework phổ biến nhất hiện nay là Laravel, có thể dễ dàng tìm thấy các hàm mở rộng thông qua hai class StrArr

** Tham khảo **

PHP Manual, PHP

MDN web docs, MDN