Menu

list() và destructuring mảng trong PHP: [$a, $b] = $arr

[$a, $b] = $array gán hai phần tử đầu tiên cho $a và $b chỉ trong một dòng, còn ['name' => $name] = $user làm điều tương tự theo khóa. list() là cách viết cũ hơn. Trang này gồm bỏ qua phần tử, hoán đổi biến, trả về nhiều giá trị, destructuring trong foreach và toán tử spread ...

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

[$a, $b] = $array; tách các phần tử của một mảng ra thành từng biến riêng chỉ trong một dòng: $a nhận $array[0], $b nhận $array[1]. list($a, $b) = $array; là cách viết cũ hơn cho cùng việc đó, còn ['name' => $name] = $user; làm điều này theo khóa.

Kết hợp destructuring với explode() là cách dùng kinh điển: tách chuỗi, đặt tên cho từng phần, rồi làm tiếp.

Bỏ qua phần tử

Để trống một vị trí để bỏ qua nó. Bạn cũng có thể dừng sớm: các phần tử không dùng ở cuối sẽ bị bỏ qua.

Destructuring mảng kết hợp theo khóa

Khi dùng khóa, thứ tự trong mảng không còn quan trọng và bạn chỉ lấy những trường cần thiết. Khóa được viết trước =>, biến viết sau.

Với list, các mẫu cũng lồng nhau theo cách tương tự: [[$x1, $y1], [$x2, $y2]] = $line; đọc hai điểm cùng lúc. Từ PHP 7.3, một biến trong mẫu cũng có thể là tham chiếu, [, &$second] = $counts;, nên thay đổi $second sẽ thay đổi cả mảng.

Một phép gán chỉ dùng hoặc vị trí, hoặc khóa, không bao giờ cả hai. [$a, 'k' => $b] = $arr; dừng lại với lỗi Cannot mix keyed and unkeyed array entries in assignments.

Hoán đổi hai biến

Tạo một mảng chứa hai giá trị theo thứ tự ngược lại rồi destructure nó trở lại. Không cần biến tạm.

Trả về nhiều giá trị từ một hàm

Một hàm PHP chỉ trả về một giá trị, nhưng giá trị đó có thể là một mảng. Destructuring ở nơi gọi hàm khiến nó đọc như thể có nhiều giá trị trả về. Với hơn hai hoặc ba giá trị, hãy trả về mảng có khóa để nơi gọi không nhầm thứ tự.

Destructuring trong foreach

Cú pháp này cũng dùng được ngay trong dòng foreach, nên mỗi hàng đến tay bạn đã được tách sẵn thành các biến có tên. Đây chính là cái mà mọi người gọi là "foreach với list()". Các mẫu vòng lặp khác có ở trang foreach.

Toán tử spread (...)

Ba dấu chấm giải nén một mảng ngay tại chỗ. Trong mảng literal, [...$a, ...$b] gộp các mảng lại. Trong lời gọi hàm, f(...$args) truyền các phần tử thành từng đối số riêng. Trong định nghĩa hàm, ...$args gom các đối số thừa vào một mảng.

Trước PHP 8.1, spread một mảng có khóa chuỗi là lỗi; giờ khóa chuỗi được giữ lại và khóa số được đánh số lại, theo cùng quy tắc với array_merge(). Tham số variadic như ...$amounts được trình bày cùng các loại tham số khác ở trang hàm.

Lỗi thường gặp: ít phần tử hơn số biến

Nếu mảng ngắn hơn mẫu, các biến bị thiếu sẽ thành null và PHP in một cảnh báo cho từng biến. Điều này xảy ra với dữ liệu đầu vào bạn không kiểm soát được, chẳng hạn một dòng bị thiếu trường. Với [$name, $city, $country] = explode(',', 'Grace');, PHP in ra:

Warning: Undefined array key 1 in /var/www/html/import.php on line 5

Warning: Undefined array key 2 in /var/www/html/import.php on line 5

Hãy quyết định phần bị thiếu nên là gì và bổ sung cho mảng trước khi destructure:

Với mẫu có khóa, hãy gộp giá trị mặc định vào trước: ['a' => $a, 'b' => $b] = $input + ['a' => null, 'b' => null];. Toán tử + chỉ thêm những khóa mà $input chưa có.

Câu hỏi thường gặp

list() trong PHP dùng để làm gì?

list($a, $b) = $array; gán $array[0] cho $a và $array[1] cho $b. Từ PHP 7.1, dạng rút gọn [$a, $b] = $array; làm y hệt như vậy, và cả hai dạng đều nhận khóa: ['id' => $id] = $row;.

Làm sao hoán đổi hai biến trong PHP?

Destructure một mảng mới tạo từ hai biến đó theo thứ tự ngược lại: [$a, $b] = [$b, $a];. Không cần biến tạm.

Có dùng list() với mảng kết hợp trong PHP được không?

Được, từ PHP 7.1. Hãy ghi rõ khóa: ['name' => $name, 'email' => $email] = $user; hoặc list('name' => $name) = $user;. Nếu không có khóa, [$a, $b] = $user; sẽ tìm khóa 0 và 1, rồi nhận null kèm một cảnh báo.

Ba dấu chấm (...) trong PHP là gì?

Đó là toán tử spread. Trong một mảng literal, [...$a, ...$b] sao chép phần tử của cả hai mảng vào một mảng mới. Trong lời gọi hàm, max(...$numbers) truyền các phần tử thành từng đối số riêng. Trong định nghĩa hàm, function sum(...$numbers) gom số lượng đối số bất kỳ vào một mảng.

Chuyện gì xảy ra nếu mảng có ít phần tử hơn số biến trong list()?

Các biến thừa nhận giá trị null, và PHP in ra cảnh báo như Undefined array key 2. Hãy bổ sung phần tử cho mảng trước, ví dụ [$a, $b, $c] = array_pad($parts, 3, null);.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu