1. Hàm array_splice() trong PHP

Như bài trước chúng ta được tìm hiểu về hàm array_slice()  với công dụng là xóa các phần tử trong một mảng. Hàm array_splice() chính là một phiên bản được nâng cấp và mở rộng của hàm array_slice() . Vì sao lại vậy? Vì khi sử dụng hàm array_splice() chúng ta cũng có thể xóa các phần tử trong mảng giống hàm array_slice() . Tuy nhiên ta cũng có thể thêm phần tử vào mảng khi sử dụng hàm array_splice() . Hàm array_splice() thường thay thế phần tử hiện có bằng một hoặc một số phần tử từ các mảng khác và trả về một mảng các phần tử bị loại bỏ hoặc thay thế.

Khi sử dụng hàm array_splice() các những key sẽ đều bị thay đổi. Nếu ta sử dụng hàm array_splice() mà không loại bỏ bất kỳ phần tử nào trong mảng thì mảng hay phần tử được thay thế sẽ được chèn vào vị trí của tham số bắt đầu mà ta chỉ đỉnh(xem kỹ hơn ở phần cú pháp). Hàm array_splice() được giới thiệu và sử dụng từ phiên bản PHP 4

2. Cú pháp của hàm array_splice() trong PHP

Ta có cú pháp của hàm array_splice() trong PHP là :

array_splice($array, $start, $length, $array2)

Trong đó :

  • $array : mảng ban đầu mà ta sẽ thực hiện việc xóa hay thêm phần tử. Tham số này là bắt buộc trong hàm
  • $start : Tham số này đề cập đến vị trí bắt đầu của mảng mà từ đó các phần tử cần được loại bỏ. Bắt buộc phải cung cấp giá trị này. Nếu giá trị được cung cấp là số âm, thì hàm bắt đầu xóa khỏi phần cuối của mảng, tức là -1 sẽ tham chiếu đến phần tử cuối cùng của mảng.
  • $length : đây là tham số để giới hạn các phần tử được cắt hay chính là số lượng phần tử ta sẽ cắt khỏi mảng. Ta cũng có thể hiểu $length chính là chiều dài của mảng được trả về. Ta cũng có thể truyền giá trị âm cho tham số này và lúc này hàm sẽ ngừng cắt phần tử cuối cùng. Tham số này là tùy chọn trong hàm
  • $array2 : tham số này đề cập đến mảng mà ta sẽ dùng các phần tử để chèn vào mảng $array .

Một số lưu ý với những tham số trong hàm array_splice() :

  • Nếu $length được cung cấp và là dương, thì dãy này sẽ có $length phần tử được cắt bắt đầu từ $start .
  • Nếu $length được cung cấp và là âm, thì dãy sẽ dừng ở các phần tử đó từ cuối mảng. Có nghĩa là nếu là -1 thì hàm sẽ không cắt phần tử cuối cùng. Nếu là -2 hàm không cắt 2 phần tử cuối cùng. Nếu là -3 thì hàm không cắt 3 phần tử cuối cùng…
  • Nếu $length bị bỏ qua thì hàm array_splice() sẽ cắt từ $start đến hết mảng. Còn nếu được chỉ định $length bằng 0 thì sẽ không có phần tử nào được cắt.
  • Nếu $array không có phần tử nào được xóa thì $array2 sẽ được chèn vào vị trí chỉ định $start
  • Nếu $array2 chỉ là một phần tử thì không cần đặt array() hoặc dấu ngoặc vuông xung quanh nó, trừ khi phần tử đó là một mảng, một đối tượng hoặc Null.
  • Key trong $array2 sẽ bị thay đổi khi được truyền vào $array . Dù nó có là key dạng số hay key dạng chuỗi.

Hàm array_splice() trả về mảng mới với phần tử đã được xóa và thêm theo chỉ định.

Ví dụ : Xóa các phần tử khỏi một mảng và thay thế nó bằng các phần tử mới

<?php
$a1=array("a"=>"PHP","b"=>"Java","c"=>"Python","d"=>"HTML");
$a2=array("a"=>"C","b"=>"CSS","c"=>"SQL");
array_splice($a1,0,2,$a2);
echo '<pre>';
print_r($a1);
?>

Kết quả

Array
(
    [0] => C
    [1] => CSS
    [2] => SQL
    [c] => Python
    [d] => HTML
)

Trong ví dụ này mảng đầu vào là $a1. Lúc này mình sử dụng hàm array_splice() để cắt 2 phần tử trong mảng bắt đầu tử phần tử thứ 0 trong mảng $a1 (vị trí phần tử trong mảng được đếm theo thứ tự từ 0 , 1 , 2 , 3 , …). Mảng $a2 là mảng được sử dụng để thay thế vào những phần tử được xóa trong mảng $a1. Kết quả cuối cùng thu về mảng $a1 mới với giá trị được xóa và thêm giống như trên.

3. Ví dụ về hàm array_splice() trong PHP

Ví dụ 1: trả về các phần tử được xóa

<?php
$a1=array("a"=>"PHP","b"=>"Java","c"=>"Python","d"=>"HTML"); 
$a2=array("a"=>"C","b"=>"CSS","c"=>"SQL");
echo '<pre>';
print_r(array_splice($a1,0,3,$a2)); //in ra giá trị bị loại bỏ
print_r($a1); //in ra mảng $a1 mới
?>

Kết quả

Array
(
    [a] => PHP
    [b] => Java
    [c] => Python
)
Array
(
    [0] => C
    [1] => CSS
    [2] => SQL
    [d] => HTML
)

Khi sử dụng hàm array_splice() ta nên lưu ý key của mảng được truyền vào để thay thế các phần tử bị xóa sẽ thay đổi. Dù nó có là key dạng số hay chuỗi thì chúng sẽ đều được đánh số lại. Giống như ví dụ trên key trong mảng $a2 dạng chuỗi nhưng khi truyền vào mảng $a1 chúng đều được đánh số lại.

Ví dụ 2: sử dụng hàm array_splice() mà không xóa phần tử nào

<?php
$a1=array("0"=>"PHP","1"=>"Java");
$a2=array("0"=>"Python","1"=>"HTML");
array_splice($a1,1,0,$a2);
echo '<pre>';
print_r($a1);
?>

Kết quả

Array
(
    [0] => PHP
    [1] => Python
    [2] => HTML
    [3] => Java
)

Với giá trị $length được đặt thành 0 thì sẽ không có phần tử nào trong mảng $a1 bị xóa. Vì vậy mảng $a2 sẽ được thêm trực tiếp vào vị trí chỉ định và cụ thể trong ví dụ này là 1 . Ta thu được mảng $a1 mới như phần kết quả

Ví dụ 3:

<?php
$input = array("red", "green", "blue", "yellow");

array_splice($input, 2);
echo '<pre>';
var_dump($input);

$input = array("red", "green", "blue", "yellow");
//dừng xóa phần tử cuối cùng của mảng
array_splice($input, 1, -1);
var_dump($input);

$input = array("red", "green", "blue", "yellow");
//sử dụng hàm count() để đếm phần tử và xóa
array_splice($input, 1, count($input), "orange");
var_dump($input);

$input = array("red", "green", "blue", "yellow");
//xóa phần tử thứ -1 nghĩa là phần tử cuối cùng
array_splice($input, -1, 1, array("black", "maroon"));
var_dump($input);
?>

Kết quả

array(2) {
  [0]=>
  string(3) "red"
  [1]=>
  string(5) "green"
}
array(2) {
  [0]=>
  string(3) "red"
  [1]=>
  string(6) "yellow"
}
array(2) {
  [0]=>
  string(3) "red"
  [1]=>
  string(6) "orange"
}
array(5) {
  [0]=>
  string(3) "red"
  [1]=>
  string(5) "green"
  [2]=>
  string(4) "blue"
  [3]=>
  string(5) "black"
  [4]=>
  string(6) "maroon"
}

Ví dụ 4: với những hàm ta đã tìm hiểu trước đó, ta sẽ có một số câu lệnh tương đương về hàm array_splice()

<?php

//nối hai phần tử vào $input
array_push($input, $x, $y);
array_splice($input, count($input), 0, array($x, $y));

// loại bỏ phần tử cuối cùng của $input
array_pop($input);
array_splice($input, -1);

// loại bỏ phần tử đầu tiên của $input
array_shift($input);
array_splice($input, 0, 1);

// chèn một phần tử vào đầu $input
array_unshift($input, $x, $y);
array_splice($input, 0, 0, array($x, $y));

// thay thế giá trị trong $input tại chỉ mục $x
$input[$x] = $y; 
array_splice($input, $x, 1, $y);

?>