การเรียงค่าข้อมูลถือเป็นงานหนึ่งของโปรแกรมเมอร์ที่ต้องพบเจอเวลาเขียนโปรแกรมอยู่เสมอ เพื่อให้ผลลัพธ์ที่แสดงออกหน้าจอเป็นไปตามที่ผู้ใช้งานต้องการ
ลองมาดูกันว่าถ้าพัฒนาโปรแกรมด้วย PHP มีฟังก์ชั่น (function) อะไรให้เรียกใช้ ในการเรียงข้อมูลที่อยู่ใน array โดยที่ไม่ต้องไปคิดวิธีการเรียงเอง เผื่อชีวิตจะง่ายขึ้น
ตัวอย่างในบทความนี้ทดสอบกับ PHP 5.3
sort — เรียงค่า (value) ใน array
วิธีการใช้
bool sort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
หมายเหตุ ค่าพารามิเตอร์แรก $array ของฟังก์ชั่น sort นี้ รวมทั้งฟังก์ชั่น sort array อื่นๆ ด้วย จะมีเครื่องหมาย & ซึ่งเป็นการ pass by reference ทำให้ฟังก์ชั่น sort สามารถแก้ไขค่าตัวแปร $array ที่ใส่ลงไปได้เลย
ตัวอย่างการใช้ฟังก์ชั่น sort
$ cat sort.php
<?php
$fruits = array("lemon", "orange", "banana", "apple");
print_r($fruits);
sort($fruits);
print "*** after sort() ***\n";
print_r($fruits);
?>
ใช้คำสั่ง php รันโปรแกรมที่เขียน
$ php sort.php Array ( [0] => lemon [1] => orange [2] => banana [3] => apple ) *** after sort() *** Array ( [0] => apple [1] => banana [2] => lemon [3] => orange )
ผลลัพธ์ที่ได้เรียงตามค่า value คือ apple, banana, lemon, orange โดยจะมีการสร้าง index หรือ key เป็นตัวเลข 0, 1, 2, 3 ของ array ใหม่
หากต้องการเรียงค่า value จากมากไปน้อย (reverse) สามารถใช้ฟังก์ชั่น rsort()
ถ้าเราใช้ฟังก์ชั่น sort นี้ ในการเรียง associative array จะทำให้ key ที่มีอยู่เดิม หายไปหมด
ตัวอย่างการใช้ฟังก์ชั่น sort() กับ associative array
$ cat sort.php <?php $fruits = array( "e" => "lemon", "r" => "orange", "a" => "banana", "p" => "apple"); print_r($fruits);
sort($fruits);
print "*** after sort() ***\n";
print_r($fruits);
?>
ใช้คำสั่ง php รันโปรแกรมที่เขียน
$ php sort.php Array ( [e] => lemon [r] => orange [a] => banana [p] => apple ) *** after sort() *** Array ( [0] => apple [1] => banana [2] => lemon [3] => orange )
สังเกตว่า key ของ array จะหายไป กลายเป็นตัวเลข 0, 1, 2, 3 แทน
หากต้องการ sort เรียงค่า value ใน associative array แต่ให้ key กับ value เดิม ยังอยู่เหมือนเดิม ต้องใช้ asort
asort – เรียงค่าใน array แต่ยังคงรักษา index หรือ key กับค่า value ให้เหมือนเดิม
วิธีการใช้
bool asort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
ตัวอย่างการใช้ asort()
$ cat asort.php <?php
$fruits = array( "e" => "lemon", "r" => "orange", "a" => "banana", "p" => "apple"); print_r($fruits);
asort($fruits);
print "*** after asort() ***\n";
print_r($fruits);
?>
ใช้คำสั่ง php รันโปรแกรมที่เขียน
$ php asort.php Array ( [e] => lemon [r] => orange [a] => banana [p] => apple ) *** after asort() *** Array ( [p] => apple [a] => banana [e] => lemon [r] => orange )
หลังจากการใช้ asort() ผลลัพธ์ที่ได้ จะเรียงตามค่า value ของ array แต่สังเกตว่า key ของแต่ละ value ยังคงเหมือนเดิม
หากต้องการเรียงค่า value โดย key ยังเหมือนเดิม จากมากไปน้อย (reverse) สามารถใช้ฟังก์ชั่น arsort()
ksort – เรียงตามค่า key ของ array
วิธีการใช้
bool ksort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
ตัวอย่างการใช้ ksort()
$ cat ksort.php <?php
$fruits = array( "e" => "lemon", "r" => "orange", "a" => "banana", "p" => "apple"); print_r($fruits);
ksort($fruits);
print "*** after ksort() ***\n";
print_r($fruits);
?>
ใช้คำสั่ง php รันโปรแกรมที่เขียน
$ php ksort.php Array ( [e] => lemon [r] => orange [a] => banana [p] => apple ) *** after ksort() *** Array ( [a] => banana [e] => lemon [p] => apple [r] => orange )
ผลลัพธ์ที่ได้ จะเรียงตาม key โดยค่า value ของแต่ละ key จะเหมือนเดิม
หากต้องการเรียงตามค่า key จากมากไปน้อย (reverse) สามารถใช้ฟังก์ชั่น krsort()
natsort – เรียงค่าใน array โดยใช้อัลกอริทึม “natural order”
วิธีการใช้
bool natsort ( array &$array )
ถ้าหากค่า value ใน array มีทั้งเป็นตัวหนังสือและตัวเลขผสมกัน อาจทำให้มีปัญหาในการเรียงค่าได้
ตัวอย่างเช่นหากต้องการเรียงชื่อไฟล์
$ cat natsort.php <?php
$files = array("img12.png", "img10.png", "img2.png", "img1.png"); print_r($files);
asort($files);
print "*** after sort() ***\n";
print_r($files);
?>
ใช้คำสั่ง php รันโปรแกรมที่เขียน
$ php natsort.php Array ( [0] => img12.png [1] => img10.png [2] => img2.png [3] => img1.png )
*** after sort() *** Array ( [3] => img1.png [1] => img10.png [0] => img12.png [2] => img2.png )
โดยดีฟอลต์ ฟังก์ชั่น asort() จะพยายามเรียงตามตัวหนังสือทีละตัวจากซ้ายไปขวา ทำให้ผลลัพธ์ที่ได้ img10.png และ img12.png มาก่อน img2.png
หากต้องการเรียงลำดับให้ img2.png มาก่อน ต้องใช้ฟังก์ชั่น natsort()
ตัวอย่างการใช้ natsort() เรียงชื่อไฟล์
$ cat natsort.php <?php
$files = array("img12.png", "img10.png", "img2.png", "img1.png"); print_r($files);
natsort($files);
print "*** after natsort() ***\n";
print_r($files);
?>
ใช้คำสั่ง php รันโปรแกรมที่เขียน
$ php natsort.php Array ( [0] => img12.png [1] => img10.png [2] => img2.png [3] => img1.png ) *** after natsort() *** Array ( [3] => img1.png [2] => img2.png [1] => img10.png [0] => img12.png )
array_multisort – เรียง array หลายมิติ
ถ้าเป็น array หลายมิติ (multi-dimensional arrays) เราสามารถใช้ ฟังก์ชั่น array_multisort() เพื่อเรียงค่า value ตามที่เราต้องการได้
array สองมิติที่พบบ่อย ในการเขียนโปรแกรม เกิดจากการดึงข้อมูลมาจากฐานข้อมูลเช่น
name | volume | edition -----+--------+-------- a | 67 | 2 b | 86 | 1 c | 85 | 6 d | 98 | 2 e | 86 | 6 f | 67 | 7
ตัวอย่างการกำหนดค่า array สองมิติ ตามข้อมูลด้านบน
$data['a'] = array('volume' => 67, 'edition' => 2); $data['b'] = array('volume' => 86, 'edition' => 1); $data['c'] = array('volume' => 85, 'edition' => 6); $data['d'] = array('volume' => 98, 'edition' => 2); $data['e'] = array('volume' => 86, 'edition' => 6); $data['f'] = array('volume' => 67, 'edition' => 7);
หากเราต้องการเรียงตามค่า volume โดยยังให้ key ที่เชื่อมโยงเหมือนเดิม
ขั้นแรกเราต้องสร้าง array ของคอลัมน์ (column) ที่จะใช้เรียง เช่นเราต้องการเรียงตาม volume เราก็ต้องสร้าง array ของ volume โดยเชื่อมโยงกับ key
วิธีการสร้าง array ของคอลัมน์ที่จะใช้เรียงค่า
foreach ($data as $key => $row) { $volume[$key] = $row['volume']; }
แล้วก็ใช้ฟังก์ชั่น array_multisort() ระบุพารามิเตอร์เป็น array ที่ใช้เรียง ตามด้วยออปชั่นการเรียง แล้วก็เป็น array สองมิติที่จะเรียง
array_multisort($volume, SORT_DESC, $data);
ออปชั่น SORT_DESC คือการเรียงจากมากไปน้อย หากต้องการเรียงน้อยไปมากให้ระบุเป็น SORT_ASC
หมายเหตุ ฟังก์ชั่น array_multisort() มีการระบุพารามิเตอร์ได้หลายรูปแบบมาก นี่เป็นแค่ตัวอย่างหนึ่งเพื่อให้ได้ผลที่ต้องการเท่านั้น
ตัวอย่างการโปรแกรม
<?php
$data['a'] = array('volume' => 67, 'edition' => 2); $data['b'] = array('volume' => 86, 'edition' => 1); $data['c'] = array('volume' => 85, 'edition' => 6); $data['d'] = array('volume' => 98, 'edition' => 2); $data['e'] = array('volume' => 86, 'edition' => 6); $data['f'] = array('volume' => 67, 'edition' => 7);
foreach ($data as $key => $row) { $volume[$key] = $row['volume']; }
array_multisort($volume, SORT_DESC, $data);
print_r($data);
?>
ตัวอย่างการรันโปรแกรม
$ php array_multisort.php Array ( [d] => Array ( [volume] => 98 [edition] => 2 )
[b] => Array ( [volume] => 86 [edition] => 1 )
[e] => Array ( [volume] => 86 [edition] => 6 )
…
ข้อมูลอ้างอิง