Skip to main content

ทำความรู้จักกับ Splat Operator และ Array destructuring ใน PHP

Kongvut Sangkla
Tags:

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

ตัวอย่างของ Splat Operator (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 อ่านดี ๆ)

ตัวอย่างของ Splat Operator (Unpack)
// 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 destructuring
// สมมุติมี 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

Array destructuring (แบบ Skip elements)
[, , $c] = $array;

// $c = 3
note

โปรดจำไว้ว่า list นั้นต้องเริ่มต้นด้วย Index เป็น 0 เสมอดังนั้น ตัวอย่างด้านล่างนี้ $c คือ การ Destructure ของ Index ตำแหน่งที่ 2 ทำให้ได้ผลลัพธ์คือ b

Array destructuring (เมื่อ Index ไม่ได้เริ่มต้นจาก 0)
$array = [
1 => 'a',
2 => 'b',
3 => 'c',
];

[, , $c] = $array;

echo $c; // b

Non-numerical keys

ใน PHP 7.1 นั้นได้อนุญาตให้ List สามารถใช้ Key ที่ไม่จำเป็นต้องเป็นตัวเลขได้แล้ว ทำให้มีความสามารถในการ Destructure ในตำแหน่งที่ระบุ โดยไม่ต้องกังวลในเรื่องของลำดับ Index

Array destructuring (with key)
$array = [
'a' => 1,
'b' => 2,
'c' => 3,
];

['c' => $c, 'a' => $a] = $array;

// 3
echo $c;

// 1
echo $a;

ตัวอย่างการนำไปใช้งาน

Array destructuring (ตัวอย่างที่ 1)
// 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 destructuring (ตัวอย่างที่ 2)
$array = [
[
'name' => 'a',
'id' => 1
],
[
'name' => 'b',
'id' => 2
],
];

// ใช้ Destructure เมื่อ Loop
foreach ($array as ['id' => $id, 'name' => $name]) {
echo $id;
// echo $name;
// …
}

References

Loading...