Trong PHP, thuật ngữ "phân tách mảng" (Array destructuring) đề cập đến cơ chế trích xuất các phần tử của mảng vào các biến riêng lẻ. Nó cũng có thể được gọi là "giải nén mảng". Cấu trúc list() của PHP được sử dụng để phân tách mảng đã cho và gán các mục của nó cho một danh sách các biến trong một câu lệnh.
list($var1, $var2, $var3, . . . ) = array(val1, val2, val3, . . .);
Kết quả là, val1 được gán cho $var1, val2 để $var2 và cứ như vậy. Mặc dù vì dấu ngoặc đơn, bạn có thể nghĩ rằng list() là một hàm, nhưng thực tế không phải như vậy vì nó không có giá trị trả về. PHP coi một chuỗi như một mảng, tuy nhiên nó không thể được giải nén bằng list(). Hơn nữa, dấu ngoặc trong list() không thể để trống.
Thay vì sử dụng list(), bạn cũng có thể sử dụng dấu ngoặc vuông [] như một cách tắt để giải cấu trúc mảng.
[$var1, $var2, $var3, . . . ] = array(val1, val2, val3, . . .);
Hãy xem xét ví dụ sau −
<?php $marks = array(50, 56, 70); list($p, $c, $m) = $marks; echo "Physics: $p Chemistry: $c Maths: $m" . PHP_EOL; # shortcut notation [$p, $c, $m] = $marks; echo "Physics: $p Chemistry: $c Maths: $m" . PHP_EOL; ?>
Nó sẽ tạo ra output −
Physics: 50 Chemistry: 56 Maths: 70 Physics: 50 Chemistry: 56 Maths: 70
Trước PHP 7.1.0, hàm list() chỉ hoạt động trên các mảng số với chỉ mục số bắt đầu từ 0. Từ PHP 7.1, việc phân tách mảng cũng hoạt động với các mảng liên kết.
Hãy thử giải cấu trúc (hoặc giải nén) mảng liên kết sau, một mảng có chỉ số không phải số.
$marks = array('p'=>50, 'c'=>56, 'm'=>70);
Để phân tách mảng này, câu lệnh list() liên kết mỗi khóa mảng với một biến độc lập.
list('p'=>$p, 'c'=>$c, 'm'=>$m) = $marks;
Thay vào đó, bạn cũng có thể sử dụng cú pháp phân tách thay thế [] .
['p'=>$p, 'c'=>$c, 'm'=>$m] = $marks;
Hãy thử và thực thi đoạn mã PHP sau đây −
<?php $marks = array('p'=>50, 'c'=>56, 'm'=>70); list('p'=>$p, 'c'=>$c, 'm'=>$m) = $marks; echo "Physics: $p Chemistry: $c Maths: $m" . PHP_EOL; # shortcut notation ['p'=>$p, 'c'=>$c, 'm'=>$m] = $marks; echo "Physics: $p Chemistry: $c Maths: $m" . PHP_EOL; ?>
Trong trường hợp của một mảng chỉ số, bạn có thể bỏ qua một số phần tử của nó và chỉ gán những phần tử khác cho các biến cần thiết.
<?php $marks = array(50, 56, 70); list($p, , $m) = $marks; echo "Physics: $p Maths: $m" . PHP_EOL; # shortcut notation [$p, , $m] = $marks; echo "Physics: $p Maths: $m" . PHP_EOL; ?>
Trong trường hợp của một mảng liên kết, vì các chỉ số không tăng dần bắt đầu từ 0, nên không cần phải tuân theo thứ tự của các phần tử khi gán.
<?php $marks = array('p'=>50, 'c'=>56, 'm'=>70); list('c'=>$c, 'p'=>$p, 'm'=>$m) = $marks; echo "Physics: $p Chemistry: $c Maths: $m" . PHP_EOL; ['c'=>$c, 'm'=>$m, 'p'=>$p] = $marks; # shortcut notation echo "Physics: $p Chemistry: $c Maths: $m" . PHP_EOL; ?>
Bạn có thể mở rộng khái niệm phân tách mảng cho các mảng lồng nhau. Trong ví dụ sau, mảng con nằm bên trong là một mảng chỉ mục.
<?php $marks = ['marks' => [50, 60, 70]]; ['marks' => [$p, $c, $m]] = $marks; echo "Physics: $p Chemistry: $c Maths: $m" . PHP_EOL; ?>
Destructuring hoạt động tốt ngay cả khi mảng lồng nhau cũng là một mảng kết hợp.
<?php $marks = ['marks' => ['p'=>50, 'c'=>60, 'm'=>70]]; ['marks' => ['p'=>$p, 'c'=>$c, 'm'=>$m]] = $marks; echo "Physics: $p Chemistry: $c Maths: $m" . PHP_EOL; ?>