ว่าด้วยฟังก์ชั่น sort ใน PHP

การเรียงค่าข้อมูลถือเป็นงานหนึ่งของโปรแกรมเมอร์ที่ต้องพบเจอเวลาเขียนโปรแกรมอยู่เสมอ เพื่อให้ผลลัพธ์ที่แสดงออกหน้าจอเป็นไปตามที่ผู้ใช้งานต้องการ

ลองมาดูกันว่าถ้าพัฒนาโปรแกรมด้วย 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
        )

 

ข้อมูลอ้างอิง

 

Leave a Reply

Your email address will not be published.