บทความ:
Perl
PHP
HTML
CSS
XML
DTD
XSD
RSS
WSDL
Linux
Site Map
Board

Sorting Array

นนทชัย ทรัพย์ทวีพงศ์ 2009-08-02 19:29:47  ให้คะแนนบทความนี้(0)  ลดคะแนนบทความ(0)  จำนวน Comment(0)  จำนวนคนอ่าน(690)  

ในกรณีที่เราต้องการเรียงข้อมูลที่มีหลายคอลัมน์นั้น (ในกรณีที่เราเก็บข้อมูลเป็นตัวแปรอะเรย์แบบ Hash หรือ Associate Array) เราจะต้องทำการบอกมันด้วยว่าเราต้องการเรียงลำดับข้อมูลจาก keys ไหนของ Array เช่น

# ข้อมูลใน report.txt
# Tony###Owen###Oxford University###2550
# Louise###Scott###Chularlongkorn University###2549
# David###Scott###Burapha University###2548
# Alan###Bill###Cambridge University###2552
# ซึ่งกำหนดให้
#       คอลัมน์แรกเป็น Name
#       คอลัมน์สองเป็น Surname
#       คอลัมน์สามเป็น University
#       คอลัมน์สี่เป็น Since_in

เมื่อเรามีข้อมูลแล้วเราต้องทำการเก็บข้อมูลใส่ตัวแปรอะเรย์ก่อน

open(<RPT>, "report.txt");
flock(RPT, 2);
@rpt = RPT;
flock(RPT, 8);
close (RPT);
# ทำการกำหนดว่าเราต้องการเรียงลำดับอะไร และเรียงจากน้อยไปมาก หรือมากไปน้อย
$sorting = "asc";
$sort_by = "Name";
# สั่งให้จัดข้อมูลใหม่ โดยให้เรียงตามเงื่อนไขที่เราต้องการ
@sort_rpt = sort sorter @rpt;
# โดยที่ sort คือคำสั่งในการเรียงของตัวแปรภาษา, sorter คือชื่อ sub ที่เรากำหนดให้ทำการเรียง,
# @rpt คือตัวแปรที่เราต้องการเรียง เพียงเท่านี้เราก็จะได้ข้อมูลที่เรียงลำดับตาม ชื่อ ที่เราต้องการแล้ว

จากนั้นให้ทำการสร้าง sub ที่ใช้สำหรับเลือก Sort keys ที่ต้องการ

sub sorter {
     # ทำการเก็บค่าที่ได้จากการตัดคำมาเก็บไว้ในตัวแปรแต่ละตัว (ซึ่งจะใช้ในการเรียงข้อมูล)
     ($name1, $surname1, $university1, $since_in1) = split(/###/, $a);
     # เป็นการบอกว่าตัวแปร $a นั้นเป็นเรคอร์ดปัจจุบัน
     ($name2, $surname2, $university2, $since_in2) = split(/###/, $b);
     # เป็นการบอกว่าตัวแปร $b นั้นเป็นเรคอร์ดต่อไป
     # ซึ่งเราจะต้องใช้เรคอร์ดปัจจุบัน กับเรคอร์ดต่อไปในการเรียงข้อมูลไปเรื่อย ๆ จนครบจำนวนแถว
     if ($sort_by eq "Name") {
          if ($sorting eq "asc") {
               return (lc($name1) cmp lc($name2));
               # เป็นการเรียงจากน้อยไปมาก
          } else {
               return (lc($name2) cmp lc($name1));
               # เป็นการเรียงจากมากไปน้อย
          }
     } elsif ($sort_by eq "Surname") {
          if ($sorting eq "asc") {
               return (lc($surname1) cmp lc($surname2));
          } else {
               return (lc($surname2) cmp lc($surname1));
          }
     } elsif ($sort_by eq "University") {
          if ($sorting eq "asc") {
               return (lc($university1) cmp lc($university2));
          } else {
               return (lc($university2) cmp lc($university1));
          }
     } elsif ($sort_by eq "Since_in") {
          if ($sorting eq "asc") {
               return (lc($since_in1) cmp lc($since_in2));
          } else {
               return (lc($since_in2) cmp lc($since_in1));
          }
     }
}
แหล่งที่มา:

Related Article

Related Download

ไม่มีรายการดาวน์โหลด



Login  Login
ค้นหา  Search
ความเห็นของผู้อ่าน
ยังไม่มีความเห็นในบทความนี้
Comment