พื้นฐานอาร์เรย์หนึ่งมิติ
$array = array(3, 5, 2, 8);
ฟังก์ชั่นการจัดเรียงที่ใช้งานได้:
sort
rsort
asort
arsort
natsort
natcasesort
ksort
krsort
ความแตกต่างระหว่างผู้ที่เป็นเพียงการไม่ว่าจะเป็นสมาคมที่สำคัญค่าจะถูกเก็บไว้ (ที่ " a
" ฟังก์ชั่น) ไม่ว่าจะเรียงลำดับจากน้อยไปสูงหรือย้อนกลับ ( " r
') ไม่ว่าจะเรียงลำดับค่าหรือปุ่ม (' k
") และวิธีการเปรียบเทียบค่า (" nat
" กับปกติ) ดูhttp://php.net/manual/en/array.sorting.phpสำหรับภาพรวมและลิงก์ไปยังรายละเอียดเพิ่มเติม
อาร์เรย์หลายมิติรวมถึงอาร์เรย์ของวัตถุ
$array = array(
array('foo' => 'bar', 'baz' => 42),
array('foo' => ..., 'baz' => ...),
...
);
หากคุณต้องการเรียงลำดับ$array
โดยปุ่ม 'foo' ของแต่ละรายการคุณต้องมีฟังก์ชั่นการเปรียบเทียบที่กำหนดเอง sort
ฟังก์ชั่นด้านบนและที่เกี่ยวข้องทำงานบนค่าง่าย ๆ ที่พวกเขารู้วิธีเปรียบเทียบและเรียงลำดับ PHP ไม่เพียง "รู้" ว่าจะทำอย่างไรกับค่าที่ซับซ้อนเช่นarray('foo' => 'bar', 'baz' => 42)
แม้ว่า; ดังนั้นคุณต้องบอก
ต้องการทำเช่นนั้นคุณจะต้องสร้างฟังก์ชั่นการเปรียบเทียบ ฟังก์ชันนั้นใช้สององค์ประกอบและจะต้องส่งคืน0
หากองค์ประกอบเหล่านี้ถือว่าเท่ากันค่าที่ต่ำกว่า0
ถ้าค่าแรกต่ำกว่าและค่าสูงกว่า0
ถ้าค่าแรกสูงกว่า นั่นคือทั้งหมดที่ต้องการ:
function cmp(array $a, array $b) {
if ($a['foo'] < $b['foo']) {
return -1;
} else if ($a['foo'] > $b['foo']) {
return 1;
} else {
return 0;
}
}
บ่อยครั้งที่คุณจะต้องการใช้ฟังก์ชั่นที่ไม่ระบุชื่อเป็นโทรกลับ หากคุณต้องการที่จะใช้วิธีการหรือวิธีการคงดูที่วิธีการอื่น ๆ ของการระบุการเรียกกลับใน PHP
จากนั้นคุณใช้หนึ่งในฟังก์ชันเหล่านี้:
อีกครั้งพวกเขาต่างกันเพียงแค่ว่าพวกเขารักษาความสัมพันธ์ของคีย์ - ค่าและเรียงตามค่าหรือคีย์ อ่านเอกสารประกอบสำหรับรายละเอียด
ตัวอย่างการใช้งาน:
usort($array, 'cmp');
usort
จะใช้สองรายการจากอาร์เรย์และเรียกcmp
ใช้ฟังก์ชันของคุณกับพวกเขา ดังนั้นcmp()
จะเรียกว่ามี$a
ฐานะarray('foo' => 'bar', 'baz' => 42)
และเป็นอีก$b
array('foo' => ..., 'baz' => ...)
จากนั้นฟังก์ชันจะกลับไปusort
ที่ค่าใดที่มีขนาดใหญ่กว่าหรือว่ามีค่าเท่ากันหรือไม่ usort
ทำซ้ำกระบวนการนี้ผ่านค่าที่แตกต่างกันสำหรับ$a
และ$b
จนกว่าจะมีการเรียงลำดับอาร์เรย์ cmp
ฟังก์ชั่นจะถูกเรียกว่าหลายครั้งอย่างน้อยหลายครั้งตามที่มีค่าใน$array
กับชุดที่แตกต่างของค่าสำหรับ$a
และ$b
ทุกครั้ง
ในการทำความคุ้นเคยกับแนวคิดนี้ให้ลอง:
function cmp($a, $b) {
echo 'cmp called with $a:', PHP_EOL;
var_dump($a);
echo 'and $b:', PHP_EOL;
var_dump($b);
}
สิ่งที่คุณทำคือกำหนดวิธีการที่กำหนดเองเพื่อเปรียบเทียบสองรายการนั่นคือทั้งหมดที่คุณต้องการ สามารถใช้ได้กับค่าทุกประเภท
โดยวิธีการนี้จะทำงานกับค่าใด ๆ ค่าไม่จำเป็นต้องมีอาร์เรย์ที่ซับซ้อน หากคุณมีการเปรียบเทียบแบบกำหนดเองที่คุณต้องการคุณสามารถทำได้ด้วยการเรียงลำดับตัวเลขอย่างง่ายเช่นกัน
sort
เรียงลำดับตามการอ้างอิงและไม่ส่งคืนสิ่งที่มีประโยชน์!
โปรดทราบว่าอาร์เรย์เรียงลำดับอยู่ในสถานที่คุณไม่จำเป็นต้องกำหนดค่าส่งคืนให้กับสิ่งใด $array = sort($array)
จะแทนที่อาร์เรย์ด้วยtrue
ไม่ใช่ด้วยอาร์เรย์ที่เรียงลำดับ เพิ่งได้sort($array);
ผล
การเปรียบเทียบตัวเลขที่กำหนดเอง
หากคุณต้องการเรียงลำดับโดยใช้baz
คีย์ซึ่งเป็นตัวเลขสิ่งที่คุณต้องทำคือ:
function cmp(array $a, array $b) {
return $a['baz'] - $b['baz'];
}
ขอขอบคุณที่อำนาจของ MATHผลตอบแทนที่คุ้มค่านี้ <0, 0 หรือ> 0 ขึ้นอยู่กับว่าเป็นราคาที่ต่ำกว่าหรือเท่ากับขนาดใหญ่กว่า$a
$b
โปรดทราบว่าสิ่งนี้จะไม่ทำงานได้ดีกับfloat
ค่าเนื่องจากจะถูกลดลงint
และสูญเสียความแม่นยำ ใช้อย่างชัดเจน-1
, 0
และ1
ค่าตอบแทนแทน
วัตถุ
หากคุณมีอาร์เรย์ของวัตถุมันจะทำงานในลักษณะเดียวกัน:
function cmp($a, $b) {
return $a->baz - $b->baz;
}
ฟังก์ชั่น
คุณสามารถทำอะไรก็ได้ที่คุณต้องการในฟังก์ชั่นการเปรียบเทียบรวมถึงฟังก์ชั่นการโทร:
function cmp(array $a, array $b) {
return someFunction($a['baz']) - someFunction($b['baz']);
}
เงื่อนไข
ทางลัดสำหรับเวอร์ชันเปรียบเทียบสตริงแรก:
function cmp(array $a, array $b) {
return strcmp($a['foo'], $b['foo']);
}
strcmp
ไม่ว่าสิ่งที่คาดหวังของcmp
ที่นี่ก็จะส่งกลับ-1
, หรือ0
1
ผู้ประกอบการยานอวกาศ
PHP 7 เปิดตัวโอเปอเรเตอร์ยานอวกาศซึ่งรวมและทำให้ง่ายขึ้นเท่ากัน / เล็กลง / ใหญ่กว่าการเปรียบเทียบข้ามประเภท:
function cmp(array $a, array $b) {
return $a['foo'] <=> $b['foo'];
}
จัดเรียงตามหลายฟิลด์
หากคุณต้องการเรียงลำดับตามหลักfoo
แต่ถ้าfoo
เท่ากับสำหรับสององค์ประกอบเรียงตามbaz
:
function cmp(array $a, array $b) {
if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) {
return $cmp;
} else {
return $a['baz'] - $b['baz'];
}
}
สำหรับผู้ที่คุ้นเคยนี้จะเทียบเท่ากับการสอบถาม SQL ORDER BY foo, baz
กับ
ยังเห็นรุ่นนี้ชวเลขอย่างมากและวิธีการสร้างเช่นฟังก์ชั่นการเปรียบเทียบแบบไดนามิกสำหรับจำนวนข้อของคีย์
จัดเรียงเป็นแบบคงที่ด้วยตนเอง
หากคุณต้องการเรียงลำดับองค์ประกอบลงใน "ลำดับด้วยตนเอง" เช่น"foo", "bar", "baz" :
function cmp(array $a, array $b) {
static $order = array('foo', 'bar', 'baz');
return array_search($a['foo'], $order) - array_search($b['foo'], $order);
}
สำหรับข้างต้นหากคุณใช้ PHP 5.3 หรือสูงกว่า (และคุณควรจริง ๆ ) ให้ใช้ฟังก์ชั่นที่ไม่ระบุชื่อสำหรับรหัสที่สั้นกว่าและเพื่อหลีกเลี่ยงการมีฟังก์ชั่นสากลอื่น ๆ
usort($array, function (array $a, array $b) { return $a['baz'] - $b['baz']; });
นั่นเป็นวิธีที่ง่ายในการเรียงลำดับอาเรย์หลายมิติที่ซับซ้อนได้ คิดอีกครั้งในแง่ของการสอน PHP ว่าจะบอกว่าอะไรในสองรายการที่ "ยิ่งใหญ่กว่า" ; ให้ PHP ทำการจัดเรียงจริง
นอกจากนี้สำหรับทั้งหมดข้างต้นเพื่อสลับระหว่างลำดับจากน้อยไปมากและจากมากไปน้อยเพียงสลับ$a
และ$b
อาร์กิวเมนต์ไปมา เช่น:
return $a['baz'] - $b['baz']; // ascending
return $b['baz'] - $a['baz']; // descending
การเรียงลำดับหนึ่งอาร์เรย์ขึ้นอยู่กับอีกอาร์เรย์หนึ่ง
แล้วมันก็มีสิ่งแปลกประหลาดarray_multisort
ซึ่งทำให้คุณสามารถเรียงลำดับหนึ่งอาเรย์จากอีกอันหนึ่งได้:
$array1 = array( 4, 6, 1);
$array2 = array('a', 'b', 'c');
ผลลัพธ์ที่คาดหวังที่นี่จะเป็น:
$array2 = array('c', 'a', 'b'); // the sorted order of $array1
ใช้array_multisort
เพื่อไปที่นั่น:
array_multisort($array1, $array2);
ในฐานะของ PHP 5.5.0 คุณสามารถใช้array_column
เพื่อแยกคอลัมน์จากหลายมิติอาเรย์และเรียงลำดับอาเรย์ในคอลัมน์นั้น:
array_multisort(array_column($array, 'foo'), SORT_DESC, $array);
ในฐานะของ PHP 7.0.0 คุณยังสามารถแยกคุณสมบัติจากอาร์เรย์ของวัตถุ
หากคุณมีกรณีทั่วไปมากขึ้นอย่าลังเลที่จะแก้ไขคำตอบนี้