เมื่อต้องการตรวจสอบว่าค่าใดค่าหนึ่งมีอยู่ใน Array ที่มีขนาดใหญ่ (พันรายการขึ้นไป) วิธีที่เร็วที่สุดคือการใช้ array_flip ร่วมกับการเข้าถึง Key โดยตรง
วิธีเร็วที่สุด (O(1))
$set = ['value1', 'value2', 'value3', /* ... พันรายการ */];
$valueToCheck = 'value2';
if (isset((array_flip($set))[$valueToCheck])) {
// พบค่าใน Array
echo "Found!";
}
เหตุผล: array_flip สลับ Key และ Value ทำให้ค่าที่ต้องการค้นหากลายเป็น Key ของ Array ใหม่ การตรวจสอบ Key ด้วย isset() มีความซับซ้อน O(1) เร็วกว่าการวนลูปหรือ in_array() ที่เป็น O(n) มาก
ฟังก์ชันตรวจสอบหลายค่าพร้อมกัน
function arrayKeysExist(array $keys, array $arr): bool {
// ตรวจสอบว่า Key ทั้งหมดใน $keys มีอยู่ใน $arr หรือไม่
return !array_diff_key(array_flip($keys), $arr);
}
// ตัวอย่างการใช้งาน
$haystack = ['a' => 1, 'b' => 2, 'c' => 3];
$needles = ['a', 'c'];
var_dump(arrayKeysExist($needles, $haystack)); // true
$needles = ['a', 'z'];
var_dump(arrayKeysExist($needles, $haystack)); // false
กรณีที่ Array มี Key เป็นตัวเลข (Indexed Array)
$largeArray = range(1, 100000); // Array 100,000 ค่า
$flipped = array_flip($largeArray); // ทำครั้งเดียว แล้วเก็บไว้ใช้ซ้ำ
// ตรวจสอบหลายครั้ง
isset($flipped[50000]); // true - เร็วมาก
isset($flipped[999999]); // false - เร็วเท่าเดิม
คำแนะนำ: หากต้องตรวจสอบหลายครั้ง ให้ array_flip() เพียงครั้งเดียวแล้วเก็บผลลัพธ์ไว้ใช้ซ้ำ จะได้ประสิทธิภาพสูงสุด