ระวังอัลกอริธึมการค้นหาแบบเชิงเส้น (ด้านบนเป็นแบบเชิงเส้น) ในอาร์เรย์แบบหลายมิติเนื่องจากมีความซับซ้อนที่เพิ่มขึ้นเมื่อความลึกเพิ่มจำนวนการวนซ้ำที่จำเป็นในการสำรวจทั้งอาร์เรย์ เช่น:
array(
[0] => array ([0] => something, [1] => something_else))
...
[100] => array ([0] => something100, [1] => something_else100))
)
จะใช้การวนซ้ำมากที่สุด 200 ครั้งเพื่อค้นหาสิ่งที่คุณกำลังมองหา (หากเข็มอยู่ที่ [100] [1]) ด้วยอัลกอริทึมที่เหมาะสม
อัลกอริธึมเชิงเส้นในกรณีนี้ทำงานที่ O (n) (เรียงลำดับจำนวนองค์ประกอบทั้งหมดในอาเรย์ทั้งหมด) ซึ่งไม่ดีมีล้านรายการ (เช่นอาร์เรย์ 1000x100x10) จะใช้เวลาเฉลี่ย 500,000 ครั้งในการค้นหาเข็ม จะเกิดอะไรขึ้นถ้าคุณตัดสินใจที่จะเปลี่ยนโครงสร้างของอาร์เรย์หลายมิติของคุณ และ PHP จะใช้อัลกอริทึมแบบเรียกซ้ำถ้าความลึกของคุณมากกว่า 100 วิทยาศาสตร์คอมพิวเตอร์สามารถทำได้ดีกว่า:
หากเป็นไปได้ให้ใช้วัตถุแทนอาร์เรย์หลายมิติเสมอ:
ArrayObject(
MyObject(something, something_else))
...
MyObject(something100, something_else100))
)
และใช้อินเทอร์เฟซตัวเปรียบเทียบแบบกำหนดเองและฟังก์ชันเพื่อจัดเรียงและค้นหา:
interface Comparable {
public function compareTo(Comparable $o);
}
class MyObject implements Comparable {
public function compareTo(Comparable $o){
...
}
}
function myComp(Comparable $a, Comparable $b){
return $a->compareTo($b);
}
คุณสามารถใช้uasort()
เพื่อใช้เครื่องมือเปรียบเทียบแบบกำหนดเองหากคุณรู้สึกว่าการผจญภัยคุณควรใช้คอลเลกชันของคุณเองสำหรับวัตถุที่สามารถเรียงลำดับและจัดการพวกมัน (ฉันมักจะขยาย ArrayObject เพื่อรวมฟังก์ชั่นการค้นหาอย่างน้อยที่สุด)
$arrayObj->uasort("myComp");
เมื่อพวกเขาถูกจัดเรียง (uasort คือ O (n log n) ซึ่งดีเท่าที่ได้รับเหนือข้อมูลที่กำหนดเอง) การค้นหาแบบไบนารีสามารถดำเนินการในเวลา O (log n) เวลานั่นคือล้านรายการใช้เวลาประมาณ 20 ครั้งในการทำซ้ำ ค้นหา. เท่าที่ฉันทราบการค้นหาไบนารีตัวเปรียบเทียบแบบกำหนดเองไม่ได้นำมาใช้ใน PHP ( array_search()
ใช้การเรียงลำดับตามธรรมชาติซึ่งทำงานกับการอ้างอิงวัตถุไม่ใช่คุณสมบัติของพวกเขา) คุณจะต้องใช้สิ่งนี้ด้วยตนเองเหมือนที่ฉันทำ
วิธีนี้มีประสิทธิภาพมากขึ้น (ไม่มีความลึกอีกต่อไป) และมีความสำคัญมากกว่า (สมมติว่าคุณบังคับใช้ความสามารถในการเปรียบเทียบโดยใช้อินเตอร์เฟส) เนื่องจากวัตถุจะกำหนดวิธีการเรียงลำดับดังนั้นคุณจึงสามารถรีไซเคิลรหัสได้อย่างไม่สิ้นสุด ดีกว่ามาก =)
$key
ไม่ถ้า ไม่มีในอาร์เรย์? จะดีกว่าif (array_key_exists($key, $array) && $array[$key] == $value) {
ไหมถ้าทำ