ทำความรู้จักกับ Splat Operator และ Array destructuring ใน PHP
Table of contents
Intro
สวัสดีครับ บทความนี้จะเขียนอธิบายการใช้งาน Splat Operator และ Array destructuring ทั้งสองการดำเนินการมีประโยชน์พอสมควร ที่จะช่วยให้การดำเนินการบางอย่างสั้นลงกร ะชับมีความเข้าใจง่าย มาดูกันครับ 😊
TL; DR;
- Splat Operator คือ การ Pack และ Unpack ตัวแปร โดยจะทำงานมีความคล้ายกับ Rest parameters ของ JS (ES6)
- Array destructuring คือ ถอดค่าจาก Array ด้วยคุณสมบัติของ List จะคล้ายกับ Destructuring assignment ของ JS (ES6)
Splat Operator
Splat Operator ความสามารถนี้นั้นมีมาตั้งแต่ PHP 5.6 โดยจะมีการทำงานอยู่ 2 แบบคือ Pack และ Unpack มีความแตกต่างกันติดหน่อย แต่สิ่งที่คล้ายกันคือทั้งสองจะทำงานเป็น Arguments ของ Function
Pack
เมื่อประกาศฟังก์ชัน และถ้าต้องการให้อาร์กิวเมนต์เป็นแบบ Dynamic (เพราะบางทีเราก็ไม่รู้จำนวนของอาร์กิวเมนต์ที่รับเข้าในฟังก์ชัน) โดยจะใช้ ...
เป็นการเก็บค่าทั้งหมดที่พารามิเตอร์ได้ส่งมาไว้ที่ตัวแปร Array เรียกว่า Pack
// ประกาศ Sum function สำหรับบวกเลข
// ใช้ ... รับค่าทั้งหมดที่ส่งเข้ามาโดย $numbers จะเป็น Array
function sum(...$numbers) {
$total = 0;
foreach ($numbers as $n) {
$total += $n;
}
return $total;
}
// เมื่อเรียกฟังก์ชัน
echo sum(1, 2, 3, 4); // กำหนดตัวเลขพารามิเตอร์ตามที่ต้องการ
> 10
// ลองอีกครั้ง
echo sum(1, 2, 3, 4, 5);
> 15
// และอีกรอบ
echo sum();
> 0
Unpack
Unpack นั้นจะต่างกับการ Pack อยู่นิดเดียวตรงที่จะใช้กับ Array และทำการ Unpack ค่าใน Array แทนที่จะ Pack Parameters เป็น Array เหมือนวิธีแบบ Pack (งง ม่ะ 5555 อ่านดี ๆ)
// Arguments สำหรับ Unpack
function add($a, $b, $c) {
return $a + $b + $c;
}
$numbers = [1, 2, 3];
// ใช้ ... กับ Array เพื่อ Unpack
echo add(...$numbers);
> 6
$first = 1;
$numbers = [2, 3];
// ใช้ ... กับ Array เพื่อ Unpack
echo add($first, ...$numbers);
> 6
$first = 1;
// ใช้กับ Array ที่เป็นแบบ "oversized" ได้
$numbers = [2, 3, 4, 5];
// แต่จะใช้ค่าใน Array 2 และ 3 เท่านั้น
echo add($first, ...$numbers);
> 6
// ใช้กับ Array เมื่อขนาด (Size) ไม่เท่ากับจำนวนของ Arguments
$arr = [2, 3];
echo add(...$numbers);
> Fatal error: Uncaught ArgumentCountError: Too few arguments to function add(), 2 passed in [...] ...
Array destructuring
Array destructuring ของ PHP นั้นมากับความสามารถของ List คือความสามารถในการดึงค่าใน Array ออกมาเป็น Variables จึงใช้คำว่า "destructure"
List
// สมมุติมี Array และค่าดังนี้
$array = [1, 2, 3];
// ใช้ List เพื่อ destructure:
list($a, $b, $c) = $array;
// แบบวิธีสั้น ๆ:
[$a, $b, $c] = $array;
// ค่าที่ได้
// $a = 1
// $b = 2
// $c = 3
Skip elements
เมื่อต้องการ Array destructuring แบบ Skip elements คือการข้ามค่าอื่น ๆ ใน Array
[, , $c] = $array;
// $c = 3
โปรดจำไว้ว่า list นั้นต้องเริ่มต้นด้วย Index เป็น 0 เสมอดังนั้น ตัวอย่างด้านล่างนี้ $c คือ การ Destructure ของ Index ตำแหน่งที่ 2 ทำให้ได้ผลลัพธ์คือ b
$array = [
1 => 'a',
2 => 'b',
3 => 'c',
];
[, , $c] = $array;
echo $c; // b
Non-numerical keys
ใน PHP 7.1 นั้นได้อนุญาตให้ List
สามารถใช้ Key ที่ไม่จำเป็นต้องเป็นตัวเลขได้แล้ว ทำให้มีความสามารถในการ Destructure ในตำแหน่งที่ระบุ โดยไม่ต้องกังวลในเรื่องของลำดับ Index
$array = [
'a' => 1,
'b' => 2,
'c' => 3,
];
['c' => $c, 'a' => $a] = $array;
// 3
echo $c;
// 1
echo $a;
ตัวอย่างการนำไปใช้งาน
// Destructure จากฟังก์ชัน pathinfo()
[
'basename' => $file,
'dirname' => $directory,
] = pathinfo('/users/test/file.png');
// Destructure จากฟังก์ชัน parse_url()
[
'path' => $path,
'query' => $query,
] = parse_url('https://stitcher.io/blog');
$array = [
[
'name' => 'a',
'id' => 1
],
[
'name' => 'b',
'id' => 2
],
];
// ใช้ Destructure เมื่อ Loop
foreach ($array as ['id' => $id, 'name' => $name]) {
echo $id;
// echo $name;
// …
}
References
- https://blog.frankdejonge.nl/array-destructuring-in-php/
- https://www.excellarate.com/blogs/destructuring-assignments-in-php7/
- https://stitcher.io/blog/array-destructuring-with-list-in-php
- https://stackoverflow.com/questions/41124015/what-is-the-meaning-of-three-dots-in-php
- https://lornajane.net/posts/2014/php-5-6-and-the-splat-operator