PHP 7+
ในฐานะของ PHP 7 สิ่งนี้สามารถทำได้อย่างกระชับโดยใช้usort
กับฟังก์ชั่นนิรนามที่ใช้ตัวดำเนินการยานอวกาศเพื่อเปรียบเทียบองค์ประกอบ
คุณสามารถเรียงลำดับจากน้อยไปมากเช่นนี้:
usort($inventory, function ($item1, $item2) {
return $item1['price'] <=> $item2['price'];
});
หรือเรียงจากมากไปน้อยเช่นนี้:
usort($inventory, function ($item1, $item2) {
return $item2['price'] <=> $item1['price'];
});
เพื่อให้เข้าใจถึงวิธีการทำงานโปรดทราบว่าusort
ใช้ฟังก์ชั่นการเปรียบเทียบที่ผู้ใช้ให้ซึ่งต้องปฏิบัติดังนี้ (จากเอกสาร):
ฟังก์ชั่นการเปรียบเทียบจะต้องคืนค่าจำนวนเต็มน้อยกว่าเท่ากับหรือมากกว่าศูนย์หากอาร์กิวเมนต์แรกถูกพิจารณาว่ามีค่าน้อยกว่าเท่ากับเท่ากับหรือมากกว่าวินาที
และทราบด้วยว่า<=>
ผู้ประกอบการยานอวกาศ
ส่งกลับค่า 0 ถ้าตัวถูกดำเนินการทั้งสองเท่ากัน 1 ถ้าด้านซ้ายมีค่ามากกว่าและ -1 ถ้าด้านขวามีค่ามากกว่า
ซึ่งเป็นสิ่งที่usort
ต้องการ ในความเป็นจริงเกือบทุกเหตุผลที่ให้ไว้สำหรับการเพิ่ม<=>
ภาษาในhttps://wiki.php.net/rfc/combined-comparison-operatorก็คือ
ทำให้การเขียนคำสั่งโทรกลับสำหรับการใช้งานusort()
ง่ายขึ้น
PHP 5.3 ขึ้นไป
PHP 5.3 แนะนำฟังก์ชั่นที่ไม่ระบุชื่อ แต่ยังไม่มีโอเปอเรเตอร์ยานอวกาศ เรายังคงสามารถใช้usort
เรียงลำดับอาร์เรย์ของเราได้ แต่มันค่อนข้างละเอียดและเข้าใจยากกว่า:
usort($inventory, function ($item1, $item2) {
if ($item1['price'] == $item2['price']) return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
});
โปรดทราบว่าแม้ว่าจะเป็นเรื่องปกติสำหรับผู้เปรียบเทียบที่เกี่ยวข้องกับค่าจำนวนเต็มเพียงแค่คืนความแตกต่างของค่าเช่น$item2['price'] - $item1['price']
เราไม่สามารถทำเช่นนั้นได้อย่างปลอดภัยในกรณีนี้ นี่เป็นเพราะราคาเป็นตัวเลขจุดลอยตัวในตัวอย่างของผู้ถามคำถาม แต่ฟังก์ชั่นการเปรียบเทียบที่เราส่งให้usort
ต้องส่งคืนจำนวนเต็มเพื่อusort
ให้ทำงานอย่างถูกต้อง:
การส่งคืนค่าที่ไม่ใช่จำนวนเต็มจากฟังก์ชั่นการเปรียบเทียบเช่น float จะส่งผลให้การส่งข้อมูลภายในเป็นจำนวนเต็มของค่าส่งคืนของการเรียกกลับ ดังนั้นค่าเช่น 0.99 และ 0.1 ทั้งคู่จะถูกแปลงเป็นค่าจำนวนเต็ม 0 ซึ่งจะเปรียบเทียบค่าดังกล่าวเท่ากัน
นี่เป็นกับดักสำคัญที่ต้องคำนึงถึงเมื่อใช้usort
ใน PHP 5.x! คำตอบดั้งเดิมของฉันเวอร์ชันนี้ทำผิดพลาด แต่ฉันก็มีผู้ติดตามมากถึงสิบคนจากการดูมากกว่าพันครั้งโดยที่ไม่มีใครสังเกตเห็นข้อผิดพลาดร้ายแรง ความง่ายในการขาดสิ่งที่ฉันสามารถทำให้ฟังก์ชั่นเปรียบเทียบได้อย่างแม่นยำคือเหตุผลที่ผู้ประกอบการยานอวกาศที่ใช้งานง่ายถูกเพิ่มเข้าในภาษาใน PHP 7