23 พ.ย. 2557

PHP FUNCTION: ฟังก์ชันเกี่ยวกับข้อมูล Array

ฟังก์ชันเกี่ยวกับข้อมูล Array
         ภาษา PHP ได้เตรียมฟังก์ชันเกี่ยวกับการเก็บข้อมูลและการประมวลผลใน array ไว้เป็นจำนวน
มากสามารถทำการประมวลผลได้อย่างครบถ้วนทั้งการค้นหา การจัดเรียง การคัดแยก การนำข้อมูลเข้าใน array การคำนวณใน array การใช้ array เป็นโครงสร้างข้อมูล stack ฯลฯ เป็นต้น  รายชื่อของฟังก์ชันที่เกี่ยวข้องกับ array แบ่งเป็นกลุ่มต่างๆ แสดงได้ดังนี้
2 1) ฟังก์ชันเกี่ยวกับการกำหนด การเปลี่ยนแปลงข้อมูลใน array
            • array array ( )
สร้างข้อมูล array ใหม่กำหนดให้ตัวแปร ตัวอย่างการใช้อยู่ในหัวข้อ 2.8 ในบทที่ 2

             • array array_rand (array input [, int num_req])
ทำการสุ่มเลือกค่า key (index) จาก array เป็นจำนวนที่ต้องการ ให้ผลลัพธ์เป็น array
ของ key/index ที่สุ่มได้มีจำนวน element ตามที่ระบุใน argument num_req หากไม่
ระบุnum_req จะสุ่มค่า index/key มาให้เพียง 1 ตัว
เช่น
<?
$input = array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun");
echo $input[array_rand($input)],"<br>\n";
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]] ,"<br>\n";
echo $input[$rand_keys[1]] ,"<br>\n";
print_r ($rand_keys);
?>
            • array array_fill ( int start_index, int num, mixed value)
ให้ผลเป็น array ที่มี index เริ่มตั้งแต่ start_index มีจำนวน element เท่ากับจำนวนที่
ระบุใน num ให้ทุกๆ element มีข้อมูลเป็นค่าที่ระบุใน value ตัวอย่างเช่น
$a = array_fill (3, 5, "None");
จะได้ตัวแปร array $a ที่มี element ได้แก่
Array ( [3]=>"None", [4]=>"None", [5]=>"None", [6]=>"None", [7]=>"None" )
            • int extract ( array var_array [, int extract_type [, string prefix]])
สร้างตัวแปรจาก associative array โดยใช้ key ของ element เป็นชื่อตัวแปรและค่าใน
element เป็นค่าของตัวแปรที่สร้างขึ้น สามารถกำหนดทางเลือกของการสร้างตัวแปรโดยระบุ
extract_type และกำหนดคำนำหน้าชื่อตัวแปรด้วย prefix ได้ตัวอย่างเช่น
$ar = array('a'=>100,'b'=>34,'c'=>69,'d'=>35,'e'=>20);
extract ($ar); จะสร้างตัวแปรขึ้น 5 ตัวได้แก่ $a, $b, $c, $d, $e มีข้อมูลเป็น 100,
34, 69, 35, 20 ตามลำดับ
         ทางเลือกของการสร้างตัวแปรในฟังก์ชัน extract (extract_type) สามารถใช้ชื่อ
constant ได้ดังนี้
o EXTR_OVERWRITE หากมีตัวแปรชื่อที่ซ้ำอยู่แล้วให้ทับตัวแปรนั้นด้วยข้อมูลที่ extract
จาก array
o EXTR_SKIP หากมีตัวแปรชื่อที่ซ้ำอยู่แล้วให้ข้ามตัวแปรนั้นไม่ต้องเปลี่ยนแปลงค่า
WEB PROGRAMMING
Using PHP. and MySQL.98 98
o EXTR_PREFIX_SAME หากมีตัวแปรชื่อที่ซ้ำอยู่แล้วให้นำหน้าชื่อตัวแปรใหม่ที่ซ้ำด้วย
prefix
o EXTR_PREFIX_ALL ให้สร้างตัวแปรทั้งหมดจาก array โดยใส่ prefix นำหน้าชื่อตัวแปร
ทุกตัว
o EXTR_PREFIX_INVALID ให้สร้างตัวแปรโดยใช้ prefix นำหน้าชื่อเฉพาะชื่อที่ผิดวิธีการ
ตั้งชื่อเท่านั้น ส่วนตัวแปรที่ key ตรงตามวิธีตั้งชื่ออยู่แล้วไม่ต้องนำหน้าชื่อตัวแปรใหม่ด้วย
prefix
o EXTR_IF_EXISTS ให้ทับตัวแปรที่มีอยู่แล้วเฉพาะตัวแปรที่อยู่ใน symbol table แล้ว
เท่านั้น
o EXTR_PREFIX_IF_EXISTS ให้สร้างตัวแปรนำหน้าชื่อด้วย prefix หากชื่อตัวแปรนั้นมีอยู่
แล้วใน symbol table
o EXTR_REFS ทำการ extracts ตัวแปรแบบ references คืออ้างอิงไปยังข้อมูลใน array
ดังนั้นตัวแปรที่เกิดขึ้นใหม่จะชี้ไปยังข้อมูลเดียวกับ element ใน array สามารถใช้ type นี้
ร่วมกับวิธีอื่นได้โดยการ OR เช่น EXTR_SKIP OR EXTR_REFSค่า default ของ
extract_type คือ EXTR_OVERWRITE
ผลลัพธ์จากฟังก์ชันนี้จะให้ตัวเลขจำนวนเต็มแสดงจำนวนตัวแปรที่สร้างขึ้นได้สำเร็จ

        • array compact ( mixed varname [, mixed varname[,...]])
เป็นฟังก์ชันที่ทำงานตรงข้ามกับ extract คือจะรวมเอาตัวแปรต่างๆ เข้ามาเป็น array และ
ให้ผลลัพธ์เป็น array ที่รวมตัวแปรต่างๆ เข้ามา โดย key ของ array ได้มาจากชื่อตัวแปร และค่าที่เก็บใน array element คือค่าข้อมูลที่มาจากตัวแปร การส่งชื่อตัวแปรสามารถใช้เป็น string แสดงชื่อตัวแปร หรือส่งเป็น array ที่บรรจุ string ชื่อของตัวแปรก็ได้เช่น
$uName = "James Bond";
$uFavColor = "red";
$lastAccess = date( "r");
$my_env = compact ('uName','uFavColor','lastAccess');
or
$env_vars = array('uName','uFavColor','lastAccess');
$my_env = compace($env_vars);
จากตัวอย่างข้างต้นไม่ว่าจะใช้ฟังก์ชัน compact ส่งชื่อตัวแปรแต่ละตัวใน argument
หรือส่ง array ที่บรรจุชื่อตัวแปร ก็จะได้รับผลเหมือนกัน คือได้ array ที่มี 3 elements ได้แก่
$my_env ['uName'] => "James Bond"
$my_env['uFavColor'] => "red" และ
$my_env['lastAccess'] => ข้อความวันที่และเวลาที่ได้จากตัวแปร $lastAccess

2 2) ฟังก์ชันเกี่ยวกับ index, internal pointer ของ array
      • array array_keys ( array ary [, mixed search_value])
ให้ผลลัพธ์เป็น array ของ key ที่มาจาก ary หากมีการระบุ search_value จะให้ผลเฉพาะ
key ของ element ที่มีค่าข้อมูล (value) ตรงกับ search_value เท่านั้น เช่น
$a1 = array(0 => 100, "color" => "red");
$a2 = array_keys($a1); //
$b1 = array("blue", "red", "green", "blue", "blue");
$b2 = array_keys($b1, "blue");
$c1 = array("color" => array("blue", "red", "green"),
 "size" => array("small", "medium", "large"));
$c2 = array_keys($c1);
ในตัวอย่างข้างต้นนี้จะได้ผลลัพธ์ได้แก่
$a2 = Array([0] => 0, [1] => color)

บทที่ 3
ฟังก์ชันมาตรฐานของภาษา PHP.99
$b2 = Array([0] => 0, [1] => 3, [2] => 4)
$c2 = Array([0] => color, [1] => size)
ตัวแปร array ในภาษา PHP แต่ละตัวจะมี internal pointer เพื่อใช้ชี้ตำแหน่ง element โดย
อัตโนมัติเมื่อไม่มีการระบุค่า key หรือ index (เช่น $a[ ] = 20) เมื่อมีการใช้งาน internal pointerเพื่ออ้างถึง element แล้ว internal pointer จะเลื่อนไปชี้ element ถัดไปโดยอัตโนมัติในการเขียนโปรแกรมสามารถใช้ฟังก์ชันเพื่อควบคุมหรือใช้งาน internal pointer ของตัวแปร array แต่ละตัวได้โดยมีฟังก์ชันที่เกี่ยวข้องดังนี้
      • mixed key(array ary)
ให้ค่า key ของตัวชี้ภายใน array ที่ชี้อยู่ปัจจุบัน
      • mixed next(array ary)
เลื่อนตำแหน่งตัวชี้ภายในของ array $ary (internal pointer )ไปยัง element ถัดไป
และให้ผลลัพธ์เป็นค่าที่เก็บใน element ที่ถูกชี้ใหม่
      • mixed prev(array ary)
เลื่อนตำแหน่งตัวชี้ภายในของ array $ary (internal pointer ) กลับไปยัง element ก่อน
หน้า และให้ผลลัพธ์เป็นค่าที่เก็บใน element ที่ถูกชี้
      • mixed end (array ary)
ตั้งตำแหน่งตัวชี้ภายในของ array $ary (internal pointer )ไปยัง element สุดท้าย และ
ให้ผลลัพธ์เป็นค่าที่เก็บใน element สุดท้ายนั้น
      • mixed reset (array ary)
ตั้งตำแหน่งตัวชี้ภายในของ array (internal pointer )ไปยัง element แรกสุด และให้
ผลลัพธ์เป็นค่าที่เก็บใน element แรกนั้น
       • array each (array ary)
      ให้ผลลัพธ์เป็น array 4 elements ที่ให้ข้อมูลเกี่ยวกับ element ปัจจุบันที่ถูกชี้ด้วย
pointer ของ array ary ซึ่ง element ทั้งสี่ของผลลัพธ์ได้แก่ [0][1]['key'] และ ['value'] โดย
element [0] และ ['key'] จะมีข้อมูลจาก index/key ของ array ary ส่วน element [1] และ
['value'] จะมีข้อมูลที่มาจากข้อมูลใน array ary ตัวอย่างเช่น
<?
$prod = array('10023''=>'Cracker', '56712'=>'Apple',
'84678'=>'Scooby');
$elem = each($prod);
?>
จะได้ตัวแปร $elem เป็น array ที่มีข้อมูลได้แก่ (ตัวชี้ใน array จะเริ่มชี้ที่ element แรก)
[0] => '10023', [1] =>'Cracker', [key]=>'10023', [value] =>'Cracker'
WEB PROGRAMMING
Using PHP. and MySQL.100 100
ฟังก์ชันนี้สามารถใช้แทน foreach เพื่อเข้าถึงแต่ละ element ใน array ได้โดยใช้กับ
while เช่น
<?php
$fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');
reset($fruit);
while (list($key, $val) = each($fruit)) {
 echo "$key => $val\n";
}
?>

2 3) การค้นหาและเลือกข้อมูลใน array
      • array array_filter ( array input [, callback callback])
ฟังก์ชัน array_filter จะให้ผลเป็น array ที่กรองเอาเฉพาะข้อมูลใน element ที่ตรงตาม
เงื่อนไขที่กำหนดโดยการใช้ฟังก์ชันที่สร้างขึ้น (callback function) ซึ่งจะยังคง key เดิมไว้ด้วย การสร้าง callback function จะต้องรับค่าจาก value ของแต่ละ element ใน array เข้าใน argumentเพื่อนำไปตรวจสอบและให้ผลเป็น boolean โดย element ที่จะถูกเลือกไปเป็นผลลัพธ์เป็น element ที่ให้ผลลัพธ์เป็น true เท่านั้น ตัวอย่างเช่น หากต้องการให้กรองเอาเฉพาะ element ที่มีข้อความที่มี
ความยาว 3 อักขระ เท่านั้น สามารถสร้างฟังก์ชันตรวจสอบและใช้ฟังก์ชัน array_filter ( ) ได้ดังนี้
<?
function acpt_str($str) {
$len = strlen($str);
return ($len==3);
}
$a = array("somsri","eak","surapont","meta","jim","nut");
$b = array_filter($a,"acpt_str");
print_r($b);
?>
ผลลัพธ์จะได้ array $b ที่มีข้อมูลดังนี้
Array ( [1] => eak [4] => jim [5] => nut )

        • bool in_array ( mixed needle, array haystack [, bool strict])
ฟังก์ชัน in_array( ) ใช้ตรวจสอบว่ามีข้อมูลที่ระบุตรงกับข้อมูลใน element ใดของ array
หรือไม่ โดยจะให้ผลเป็น Boolean แสดงว่าพบหรือไม่ argument ของฟังก์ชันนี้ได้แก่
o needle คือข้อมูลที่ต้องการค้นหาเป็นข้อมูลชนิดใดๆ
o haystack คือ array ที่ทำการค้นหาข้อมูล
o stict เป็น Boolean ระบุว่าต้องการตรวจสอบข้อมูลที่ตรงชนิดกันด้วยหรือไม่ (เนื่องจาก
ปกติ PHP จะแปลงชนิดข้อมูลให้เอง) หากเป็น true คือชนิดต้องตรงกันด้วย
ตัวอย่างเช่น
in_array(30,array('abc','30years','beatle'))
ให้ผล true เนื่องจาก 30 เมื่อเปรียบเทียบกับข้อมูล '30years' PHP จะแปลงให้เป็นชนิด
integer ซึ่งได้ 30 เช่นกันแต่หากกำหนด strict เป็น true เช่น
in_array(30,array('abc','30years','beatle'),true)
จะให้ผล false เนื่องจาก 30 และ '30years' มีชนิดข้อมูลต่างกัน
หากข้อมูลที่ต้องการค้นหาเป็นข้อความจะเปรียบเทียบแบบ case sensitive คือถืออักษรตัว
ใหญ่เล็กมีความต่างกัน เช่น
in_array ('Abc', array('abc','30years','beatle'))
จะให้ผล false เนื่องจาก 'Abc' และ 'abc' มีตัว A และ a แตกต่างกัน

      • mixed array_search ( mixed needle, array haystack [, bool strict])
ฟังก์ชัน array_search ทำหน้าที่ตรวจสอบว่ามีข้อมูลตรงกับ element ใดๆ ใน array หรือไม่
เช่นเดียวกันกับฟังก์ชัน in_array( ) แต่จะให้ผลลัพธ์เป็นค่า key ของ element ที่พบ หรือให้ค่า false
หากไม่พบ (ดูรายละเอียดของ argument ต่างๆ ในฟังก์ชัน in_array( ) ที่ผ่านมาแล้ว)

       • bool array_key_exists ( mixed key, array ary)
เป็นฟังก์ชันที่ทำการตรวจสอบว่าใน array ary มี element ที่มีค่า key ตามที่ระบุใน
argument key หรือไม่ จะให้ผลเป็น Boolean แสดงว่าพบให้ค่า true หรือไม่พบให้ค่า false

2 4) การจัดเรียงข้อมูลใน array
การจัดเรียงลำดับข้อมูลใน array มีการจัดเรียงลำดับจากข้อมูล 2 ส่วนได้แก่ จากข้อมูลที่เก็บ
ในแต่ละ element หรือจาก value และการเรียงลำดับจาก key/index ที่เป็นตัวชี้ element ต่างๆ ซึ่งสามารถใช้เป็นข้อความได้ (คือ associative array) และการจัดเรียงลำดับยังอาจจะจัดเรียงจากข้อมูลน้อยไปหามาก (ascending) หรือมากไปหาน้อย (descending) หรือเรียกว่า reverse order หากเป็นข้อความภาษาอังกฤษยังอาจมีการเรียงโดยเป็นลักษณะ case sensitive หรือ case insensitive คือแยกความแตกต่างระหว่างอักษรตัวใหญ่ (A-Z) กับตัวเล็ก (a-z) หรือไม่ กรณี case sensitive ถือว่าอักษร a กับ A ต่างกัน แต่หากเป็น case insensitive ถือว่าอักษร a กับ A เหมือนกันฟังก์ชันการเรียงลำดับข้อมูลใน array ของภาษา PHP มีฟังก์ชันต่างๆ ได้แก่ sort ( ), rsort
( ), arsort( ), asort( )
       • bool sort ( array $ary [, int sort_flags])
ฟังก์ชัน sort( ) เรียงลำดับข้อมูลใน array จากน้อยไปมาก สามารถกำหนดให้เรียงลำดับแบบ
ตัวเลขหรือแบบข้อความได้ฟังก์ชันนี้จะจัด index ให้ใหม่โดยจะยกเลิก key/index เดิม มีลักษณะการจัดเรียงข้อความแบบ case sensitive คือถืออักษรตัวใหญ่และตัวเล็กแตกต่างกันผลลัพธ์จากฟังก์ชันนี้นอกจากจะจัดเรียงข้อมูลที่อยู่ใน array $ary แล้ว ยังให้ผลลัพธ์เป็น trueหากสามารถจัดเรียงได้สำเร็จ หากไม่สามารถจัดเรียงได้จะให้ผลเป็น false

      sort_flags เป็นการกำหนดวิธีการจัดเรียงมี 3 วิธีได้แก่
• SORT_REGULAR – เรียงตามชนิดข้อมูล (เป็นค่า default)
• SORT_NUMERIC – เรียงแบบตัวเลข
• SORT_STRING – เรียงแบบข้อความ
ตัวอย่างเช่น
$a = array('cameroon', 'bolivia', 'Norway', 'finland', 'finland/2',
'finland18');
sort($a);
ผลลัพธ์ตัวแปร $a หลังจากการจัดเรียงจะได้
Array([0]=>Norway, [1]=>bolivia, [2]=>cameroon, [3]=>finland, [4]
=>finland18, [5]=>finland2 )

ตัวอย่างการเรียงลำดับข้อมูลตัวเลข
$a = array(38,198,26,57,9,'');
sort($a);
sort($a, SORT_NUMERIC);
sort($a, SORT_STRING);
WEB PROGRAMMING
Using PHP. and MySQL.102 102
ผลลัพธ์ตัวแปร $a หลังจากการจัดเรียงโดยไม่กำหนด sort_flags หรือกำหนดเป็น
SORT_NUMERIC จะได้
Array ( [0]=>'', [1]=>9, [2]=>26, [3]=>38, [4]=>57, [5]=>198 )
แต่หากกำหนด sort_flags เป็น SORT_STRING จะได้ผลลัพธ์เป็น
Array ( [0]=>'', [1]=>198, [2]=>26, [3]=>38, [4]=>57, [5]=>9 )
     ฟังก์ชัน sort( ) จะทำการยกเลิกและกำหนดค่า key/index ใหม่ดังตัวอย่างนี้
$a = array
('ca'=>'cameroon','bo'=>'bolivia','no'=>'norway','fi'=>'finland');
sort($a);
ผลจากการจัดเรียงจะได้ array $a ใหม่เป็น
Array ([0]=>bolivia, [1]=>cameroon, [2]=>finland, [3]=>norway )

      • bool rsort ( array $ary [, int sort_flags])
ฟังก์ชัน rsort( ) เป็นฟังก์ชันเรียงลำดับเช่นเดียวกับ sort( ) คือจะเรียงลำดับข้อมูล (value) ใน
array โดยจะกำหนด key/index ให้แต่ละ element ใหม่ตามลำดับที่จัดเรียงข้อมูล ข้อมูลข้อความที่
จัดเรียงจะถือว่าอักษรใหญ่กับเล็กเป็นคนละตัว (case sensitive) สามารถกำหนดวิธีจัดเรียงแบบตัวเลข
หรือข้อความได้แต่แตกต่างกันคือจะจัดเรียงจากมากไปหาน้อย (reverse order)
ตัวอย่างการเรียงลำดับข้อมูลตัวเลข
$a = array(38,198,26,57,9,'');
rsort($a);
ผลจากการจัดเรียงด้วย rsort( ) จะได้ array $a ใหม่เป็น
Array ([0]=>198, [1]=>57, [2]=>38, [3]=>26, [4]=>9, [5] =>'')

     • bool asort ( array $ary [, int sort_flags])
ฟังก์ชัน asort( ) เป็นฟังก์ชันเรียงลำดับเช่นเดียวกับ sort( ) คือจะเรียงลำดับข้อมูล (value) ใน
array ข้อมูลข้อความที่จัดเรียงจะถือว่าอักษรใหญ่กับเล็กเป็นคนละตัว (case sensitive) สามารถ
กำหนดวิธีจัดเรียงแบบตัวเลขหรือข้อความได้จะจัดเรียงจากน้อยไปหามาก แต่มีความแตกต่างกันคือ
จะคงค่า key/index ที่สัมพันธ์กับแต่ละ element เดิมไว้
ตัวอย่างเช่น
$a = array
('ca'=>'cameroon','bo'=>'bolivia','no'=>'norway','fi'=>'finland');
asort($a);
ผลจากการจัดเรียงจะได้ array $a ใหม่ด้วย asort( ) จะได้เป็น
Array ( [bo] => bolivia [ca] => cameroon [fi] => finland [no] =>
norway )

      • bool arsort ( array $ary [, int sort_flags])
ฟังก์ชัน arsort( ) เป็นฟังก์ชันเรียงลำดับที่คงค่า key/index ที่สัมพันธ์กับแต่ละ element เดิม
ไว้เช่นเดียวกับ asort( ) แต่จะเรียงลำดับจากมากไปหาน้อย (reverse order)
การเรียงลำดับข้อมูลใน array โดยให้เรียงลำดับตามค่าของ key/index มี 2 ฟังก์ชัน ได้แก่
ksort( ) และ krsort( ) ทั้งสองฟังก์ชันจะจัดเรียงลำดับโดยใช้ key ทั้งที่เป็นตัวเลข (numeric key)
หรือข้อความ (associative array) โดยถือ case sensitive ซึ่ง ksort( ) จะจัดเรียงจากน้อยไปมาก
บทที่ 3
ฟังก์ชันมาตรฐานของภาษา PHP.103
ส่วน krsort( ) จะจัดเรียงจากค่า key มากไปน้อย และสามารถกำหนด sort_flags ได้เช่นเดียวกับ
ฟังก์ชัน sort( )

• bool ksort ( array $ary [, int sort_flags])

• bool krsort ( array $ary [, int sort_flags])
       การจัดเรียงโดยทั่วไปจะจัดเรียงลำดับตามรหัสของอักขระที่เป็น ASCII code แม้แต่ข้อความที่
มีลำดับตัวเลขต่อท้าย เช่น 'prod1', 'prod16', 'prod2', 'prod10'จะถูกเรียงลำดับเป็น 'prod1','prod10', 'prod16', 'prod2' เนื่องจากอักขระเลข 2 มีค่ารหัสมากกว่าเลข 1 แต่ในบางครั้งการเรียงลำดับลักษณะที่มีตัวเลขผสมอยู่เรามักต้องการเรียงลำดับโดยดูค่าของตัวเลขเป็นสำคัญด้วย เช่นตัวอย่างก่อนหน้าต้องการให้เรียงลำดับเป็น 'prod1', 'prod2', 'prod10', 'prod16' ตามลำดับเช่นนี้จะต้องใช้การเรียงลักษณะที่เรียกว่า natural order ซึ่งใน PHP มีฟังก์ชัน 2 ฟังก์ชันได้แก่
natcasesort( ) และ natsort( ) โดย natcasesort( ) จะเป็น case insensitive คือถือว่าตัวอักษร
ภาษาอังกฤษตัวใหญ่และตัวเล็กเหมือนกัน ฟังก์ชันทั้งสองจะคง key ที่สัมพันธ์กับค่าที่เก็บข้อมูลไว้

• void natcasesort (array $ary)

• void natsort (array $ary)
     วิธีการจัดเรียงข้อมูลมีส่วนสำคัญคือการเปรียบเทียบข้อมูลไม่ว่าจะเป็นข้อความหรือตัวเลข ซึ่ง
หากเป็นข้อความจะเปรียบเทียบรหัสของแต่ละอักขระ โดยเริ่มจากซ้ายไปขวาหากพบว่ามีความแตกต่าง
ที่ตำแหน่งใดก็จะให้ผลการเปรียบเทียบตำแหน่งแรกที่พบ ในข้อมูลบางประเภทที่กำหนดเองหรือแม้แต่
เป็นภาษาที่ไม่ใช่ภาษาอังกฤษหากต้องการเรียงลำดับข้อมูลตามความต้องการที่แตกต่างไปจากการ
เปรียบเทียบข้อความตามปกติหรือแม้แต่เป็นตัวเลขที่ไม่ได้เปรียบเทียบตามแบบปกติก็ตาม ก็สามารถ
กำหนดวิธีการเปรียบเทียบข้อมูลเพื่อใช้ในการจัดเรียงเองได้เป็นฟังก์ชันที่สร้างขึ้นเอง (user defined
function)ในภาษา PHP. มีฟังก์ชันการจัดเรียงลำดับข้อมูลใน array ที่สามารถกำหนดวิธีการจัดเรียงข้อมูลเองได้ 3 ฟังก์ชันได้แก่ usort( ) เพื่อจัดเรียงจากน้อยไปมากโดยจัดค่า index/key ให้ใหม่ตามผลการจัดเรียงข้อมูลที่ได้ uasort ( ) จัดเรียงโดยให้คง index/key คู่กับค่าข้อมูลเดิมไว้และ uksort( ) ให้จัดเรียงตาม key โดยใช้ user define function ในการจัดเรียงตาม keyการสร้างฟังก์ชันเปรียบเทียบเพื่อการจัดเรียงข้อมูลจะต้องเป็นฟังก์ชันที่รับ argument 2 ตัวเช่น mycompare($a, $b) เพื่อนำมาเปรียบเทียบกันและให้ผลลัพธ์เป็น integer เพื่อแสดงผลการเปรียบเทียบโดย ให้ผลเป็น 0 หากเปรียบเทียบได้เท่ากัน ให้ผลเป็น ค่าบวกที่มากกว่า 0 หากargument แรกคือ argument ตัวซ้ายมากกว่า argument ตัวที่สองหรือ argument ทางขวาและให้ผลเป็นค่าน้อยกว่า 0 (ค่าลบ) หาก argument ตัวแรกน้อยกว่าตัวอย่างการสร้างฟังก์ชันที่ใช้เปรียบเทียบหากต้องการเปรียบเทียบค่าตัวเลขโดยไม่คำนึงถึงเครื่องหมายบวกลบ (ใช้เฉพาะค่า) สามารถสร้างฟังก์ชันเพื่อเปรียบเทียบได้ดังนี้
function unum_cmp ($n1, $n2) {
$j1 = abs($n1);
$j2 = abs($n2);
$result = $j1 - $j2;
return $result;
}

รูปแบบการใช้ฟังก์ชันจัดเรียงที่กำหนดวิธีเปรียบเทียบเอง
• bool usort ( array $ary, callback cmp_function)
• bool uasort ( array $ary, callback cmp_function)
• bool uksort ( array $ary, callback cmp_function)

ตัวอย่างการใช้ฟังก์ชันเปรียบเทียบที่สร้างเองกับการจัดเรียงข้อมูล
$a = array(143,-50,30,80,20,-60);
usort($a, "unum_cmp");
WEB PROGRAMMING
Using PHP. and MySQL.104 104
จะได้ผลลัพธ์ตัวแปร $a ที่ถูกจัดเรียงแล้วเป็น
Array ([0]=>20, [1]=>30, [2]=>-50, [3]=>-60, [4]=>80, [5]=>143 )
ซึ่งหากใช้ฟังก์ชันการจัดเรียงธรรมดาคือ sort( ) จะได้ผลลัพธ์
Array ([0]=>-60, [1]=>-50, [2]=>20, [3]=>30, [4]=>80, [5]=>143 )

2 5) การคำนวณ ประมวลผล
     • array array_count_values (array ary)
ให้ผลลัพธ์เป็น array ที่แสดงผลการนับจำนวน (ความถี่) ของข้อมูลแต่ละค่าที่มีใน array ary
โดย key ของผลลัพธ์ได้จากค่าข้อมูล และ value ที่เก็บจะเป็นจำนวนครั้งที่ปรากฏใน ary เช่น
$a = array(1, "hello", 1, "world", "hello");
$b = array_count_values($a);
ผลลัพธ์ของตัวแปร $b จะได้ Array ( [1] => 2, [hello] => 2, [world] => 1)

     • mixed array_sum ( array ary)
ฟังก์ชัน array_sum ทำการคำนวณหาค่าผลรวมของข้อมูลที่เก็บใน array ary หากมี
element ใน array ที่มีข้อมูลชนิดอื่นที่ไม่ใช่ตัวเลข จะพยายามแปลงให้เป็นตัวเลขตามวิธีการ
มาตรฐานของ PHP. ผลลัพธ์จะได้เป็นข้อมูลตัวเลขจำนวนเต็มหรือจุดทศนิยมขึ้นกับข้อมูลใน array ary

2 6) การแยก-รวม array
• array array_merge ( array arry1, array arry2 [, array ...])
ฟังก์ชัน array_merge( ) ให้ผลลัพธ์เป็น array ที่ได้จากการรวม array ใน argument โดย
เริ่มจาก element ใน array แรกแล้วเรียงต่อด้วย array ต่อๆ ไป หากมี key/index เป็นข้อความที่ซ้ำ
กัน element ที่มาจาก array หลังจะทับข้อมูลของ element ที่มี string index ที่ตรงกัน

• array array_combine ( array keys, array values)
ให้ผลลัพธ์เป็น array ที่ได้จาก array ใน argument 2 ตัว โดยใช้ค่าข้อมูลใน argument
แรกเป็น (keys) เป็น key/index และใช้ข้อมูลจาก array values เป็นค่าข้อมูล หาก array ทั้งสองใน
argument มีจำนวน element ไม่เท่ากัน หรือเป็น empty array จะให้ผลเป็น false

• array array_slice ( array arry, int offset [, int length])
ฟังก์ชัน array_slice() ให้ผลเป็น array ที่มี element มาจาก array ใน argument เริ่ม
จากelement ลำดับที่ระบุใน offset เป็นจำนวน element ที่ระบุใน length
หากค่า offset เป็นลบจะเริ่มจาก element ลำดับที่ย้อนกลับมาจาก element สุดท้าย หากไม่
ระบุ length จะนำข้อมูลตั้งแต่ element ลำดับที่ตาม offset จนถึง element สุดท้าย ฟังก์ชันนี้จะไม่
สนใจ key ผลลัพธ์จะได้จากลำดับที่ element วางอยู่ใน array
ตัวอย่างเช่น

<?php
$a = array('apple','banana','coconut','grape','orange');
$b = array_slice($a,2,2);
$c = array_slice($a,-4,2);
$d = array_slice($a,2);
$e = array_slice($a,-2);
?>

ผลลัพธ์ตัวแปร array ต่างๆ ได้แก่
b = Array ( [0] => coconut [1] => grape )
c = Array ( [0] => banana [1] => coconut )
d = Array ( [0] => coconut [1] => grape [2] => orange )
e = Array ( [0] => grape [1] => orange )

2 7) การเข้าถึงข้อมูลใน array
• integer count (array ary[, int mode])
• integer sizeof(array ary[, int mode])
ฟังก์ชัน count( ) และ sizeof( ) เป็นฟังก์ชันที่ให้จำนวน element ที่มีใน array ary หากต้องการนับจำนวน element ใน array หลายมิติต้องกำหนด mode เป็น COUNT_RECURSIVE หรือ
1 หากไม่กำหนดหรือกำหนดเป็นค่า 0 จะนับ element ของ array ลำดับนอกสุด คือ index ซ้ายสุด
• mixed current ( array ary)
• mixed pos (array ary)
ฟังก์ชัน current ( ) และ pos( ) ให้ข้อมูลจาก array ary ณ ตำแหน่งที่ internal pointer
ของ array ary นั้นชี้อยู่ โดยไม่มีผลต่อ pointer (pointer จะไม่เลื่อนไปยัง element อื่นหลังจากใช้
ฟังก์ชันนี้)
• void list(mixed)
list( ) เป็น language construct ที่ใช้ดึงค่าจาก array นำมาใส่ในตัวแปรที่อยู่ใน
argument มีรูปแบบที่แปลกกว่าคำสั่งอื่นๆ เนื่องจากเป็นคำสั่งที่อยู่ทางด้านซ้ายของ expression
คือเขียนคำสั่งในรูปแบบ list(var1,var2,…) = array เช่น

<?php
$a = array('apple','banana','coconut','grape','orange');
list($x,$y,$z) = $a;
?>

จากตัวอย่างนี้ตัวแปร $x จะมีข้อมูล 'apple' ตัวแปร $y จะมีข้อมูล 'banana' และ $z จะมี
ข้อมูล 'coconut' เราอาจจะข้าม element บาง element ได้ด้วยการไม่ใส่ชื่อตัวแปร เช่น
list($x,,$y) = $a;
จะข้าม element ที่สองของ array $a ดังนั้นตัวแปร $x และ $y จะมีข้อมูล 'apple' และ
'coconut' ตามลำดับ
WEB PROGRAMMING
Using PHP. and MySQL.106 106

3 ฟังก์ชันเกี่ยวกับข้อมูล String
ฟังก์ชันเกี่ยวกับข้อมูลชนิด string ในภาษา PHP แบ่งออกเป็นกลุ่มต่างๆ และมีรายละเอียดของฟังก์ชันที่ใช้ประโยชน์กันโดยทั่วไปดังนี้

3 1) ฟังก์ชันที่ให้ข้อมูลจากข้อความ
• int strlen(string str)
ฟังก์ชันที่ให้ตัวเลขความยาวของข้อความที่อยู่ใน str เป็นจำนวนอักขระ เช่น strlen
("abcdef"); จะได้ค่า 6 คือมีอักขระจำนวน 6 ตัว การใช้งานอาจจะใช้เพื่อตรวจสอบความยาวของ
ข้อความที่ผู้ใช้ป้อน เช่น password หากมีจำนวนอักขระน้อยหรือมากกว่าที่กำหนดจะให้พิมพ์เข้า
ใหม่ เป็นต้น
ตัวอย่างการใช้งาน (การรับข้อมูลจากผู้ใช้และตัวแปร $_POST[ ] ดูรายละเอียดในบทที่ 4)

<?php
define('PWD_MIN',4);
define('PWD_MAX',8);
function isBetween ($val, $min, $max) {
return ($val>=$min && $val<=$max);
}
$pwlen = strlen($_POST['password']);
if (!isBetween($pwlen, PWD_MIN, PWD_MAX))
echo "Password length must be 4-8 characters";
else
echo "Password OK.";
?>

      • string substr(string str, int offset, int length)
      ฟังก์ชันนี้จะให้บางส่วนของข้อความจาก str โดยเริ่มตั้งแต่ตำแหน่งที่ระบุใน offset(ตำแหน่งของอักขระแรกสุดคือ 0) เป็นจำนวนความยาวตามที่ระบุใน length เช่น substr("abcdefghi",3,4) จะได้ข้อความ "defg" เป็นต้น หากค่า offset เป็นค่าลบ จะนับย้อนจากท้ายข้อความ เช่น substr("abcdefghi",-3,2) จะได้ "gh" เป็นต้น หากข้อความที่มีใน str น้อยกว่าที่ระบุใน offset และ length จะให้ข้อความเท่าที่มีใน str เท่านั้น เช่น substr("abcdefghi",6,4)จะได้ข้อความ "ghi" เป็นต้นหาก length เป็นค่าลบ หมายถึงจำนวนอักขระที่จะหยุดไม่นำมาเป็นผลลัพธ์นับจากท้ายข้อความ เช่น

<?php
$rest = substr("abcdef", 0, -1); // returns "abcde"
$rest = substr("abcdef", 2, -1); // returns "cde"
$rest = substr("abcdef", 4, -4); // returns ""
$rest = substr("abcdef", -3, -1); // returns "de"
?>

     • string trim (string str [, string charlist])
     ให้ผลลัพธ์เป็นข้อความจาก str ที่ตัด whitespace ที่อยู่ด้านหน้าและด้านหลังของ
ข้อความออกแล้ว เช่น trim(" vwxyz ") จะได้ "vwxyz" เป็นต้น อักขระที่ถือว่าเป็น whitespace
ได้แก่
o " " คือช่องว่าง
o "\t" เครื่องหมาย tab.
o "\n" เครื่องหมายขึ้นบรรทัดใหม่ new line (line feed).
o "\r" เครื่องหมาย carriage return.

บทที่ 3
     ฟังก์ชันมาตรฐานของภาษา PHP.107
o "\0" อักขระ NUL (ASCII 0)
o "\x0B" เครื่องหมาย vertical tab.
    นอกจากนี้ยังสามารถกำหนดรายการของอักขระที่จะตัดออกได้เองแทนอักขระwhitespace ที่กำหนดข้างต้นด้วยโดยกำหนดอักขระที่ต้องการให้ตัดทุกตัวใน charlist เช่น ".\t "เป็นการกำหนดว่าให้ตัดอักขระ . และ \t (tab) และ space ที่หัวและท้าย และสามารถใช้ .. เพื่อกำหนดช่วงของอักขระที่ต้องการตัดออกได้เช่น trim($st,"\x00..\x1F") กำหนดให้ตัดอักขระควบคุมที่มีรหัส ASCII ตั้งแต่ 00 ถึง 1F ออกทั้งหมด เป็นต้น

     • string ltrim (string str [, string charlist])
ให้ผลลัพธ์เป็นข้อความจาก str ที่ตัด whitespace หรืออักขระที่กำหนดใน charlist ที่อยู่ด้าน
หน้า (ทางซ้าย) ของข้อความออก เช่น ltrim(" vwxyz ") จะได้ "vwxyz " เป็นต้น (อักขระ
whitespace และการกำหนด charlist ทำได้เหมือนกับฟังก์ชัน trim( ))

    • string rtrim (string str [, string charlist])
    • string chop (string str [, string charlist])
     ให้ผลลัพธ์เป็นข้อความจาก str ที่ตัด whitespace หรืออักขระที่กำหนดใน charlist ที่อยู่ด้านหลังของข้อความออกแล้ว เช่น rtrim(" vwxyz ") จะได้ " vwxyz" เป็นต้น (อักขระ whitespaceและการกำหนด charlist ทำได้เหมือนกับฟังก์ชัน trim( ))กลุ่มฟังก์ชันที่ให้ข้อความที่เปลี่ยนอักษรตัวใหญ่-เล็ก (upper/lower case) ของภาษาอังกฤษในข้อความ มี 4 ฟังก์ชันได้แก่
     • string strtolower (string str) เปลี่ยนเป็นอักษรตัวเล็ก เช่น strtolower("ABc X2") จะได้
ข้อความ "abc x2" เป็นต้น
      • string strtoupper (string str) เปลี่ยนเป็นอักษรตัวใหญ่ เช่น strtoupper("xod2-je") จะ
ได้ข้อความ "XOD2-JE" เป็นต้น
      • string ucwords (string str) เปลี่ยนเป็นอักษรตัวใหญ่ที่ตัวอักษรแรกของคำ ฟังก์ชันนี้จะไม่
เปลี่ยนแปลงตัวอักษรตัวอื่นๆ หากตัวอื่นๆ เป็นตัวใหญ่ก็จะไม่เปลี่ยนให้เป็นตัวเล็ก หากต้องการ
ตัวใหญ่เฉพาะตัวแรกให้ใช้ฟังก์ชัน strtolower( ) ร่วมกับ ucwords( ) เช่น ucwords
(strtolower($str)) เพื่อแปลงข้อความทั้งหมดให้เป็นตัวเล็กก่อนแล้วจึงแปลงอักษรตัวแรกของ
คำให้เป็นตัวใหญ่
      • string ucfirst (string str) เปลี่ยนตัวอักษรแรกของข้อความเป็นอักษรตัวใหญ่ (ฟังก์ชันนี้จะ
ไม่เปลี่ยนแปลงตัวอักษรตัวอื่นๆ หากตัวอื่นๆ เป็นตัวใหญ่ก็จะไม่เปลี่ยนให้เป็นตัวเล็ก)
      • string str_repeat ( string input, int multiplier)
ฟังก์ชันนี้จะสร้างข้อความโดยทำซ้ำข้อความจาก input เป็นจำนวน multiplier ครั้ง เช่น
$st = str_repeat("= ", 10);
$pws = str_repeat("*", strlen($pwd));
ในตัวแปร $st จะมีข้อความ "= = = = = = = = = = " อยู่ภายใน ส่วน $pws จะมีตัว *
เป็นจำนวนเท่ากับความยาวของข้อความที่อยู่ในตัวแปร $pwd เป็นต้น

     • string str_pad ( string input, int pad_length [, string pad_string [, int
pad_type]])
      ฟังก์ชันนี้จะให้ข้อความที่เติมช่องว่างหรือข้อความที่ต้องการที่ระบุใน pad_string เข้าไปที่ด้านหน้าหรือต่อท้ายข้อความใน input เพื่อให้มีความยาวของข้อความภายในผลลัพธ์ครบจำนวน pad_length ตัว การเติมสามารถทำได้ทั้งด้านหน้าหรือที่ท้ายข้อความระบุโดย pad_typeo หากไม่ระบุ pad_string จะใช้ช่องว่างเพื่อเติมข้อความo pad_type เป็นการระบุการเติมจะเติมอย่างไร โดยมี STR_PAD_RIGHT เติมต่อท้ายหรือทางขวาของข้อความ, STR_PAD_LEFT เติมด้านหน้าหรือทางซ้ายของข้อความ,STR_PAD_BOTH เติมทั้งด้านหน้าและต่อท้าย หากไม่ระบุ pad_type จะเติมที่ท้ายหรือด้านขวาของข้อความ

   o หาก pad_length มีค่าเป็นลบหรือมีค่าน้อยกว่าความยาวข้อความใน input จะไม่มีการ
เติมข้อความเพิ่มเข้าไป
    o ข้อความที่ระบุใน pad_string จะใช้เติมจนกระทั่งได้ข้อความที่ยาวครบตามที่ระบุใน
pad_length เท่านั้น
ตัวอย่าง
str_pad ("abc",8) จะได้ "abc "
str_pad ("abc",8, ".", STR_PAD_LEFT) จะได้ ".....abc"
str_pad ("abc",8, "-",STR_PAD_BOTH) จะได้ "--abc---"
str_pad ("abc",8, "!?!#") จะได้ "abc!?!#!"
     • string str_shuffle ( string str)
ฟังก์ชัน str_shuffle จะให้ผลเป็นข้อความที่ทำการสับเปลี่ยนลำดับของอักขระต่างๆ ที่อยู่
ใน str โดยการสุ่ม เช่น str_shuffle("macintosh powerbook G4") จะได้ข้อความที่สลับลำดับ
ของอักขระต่างๆ อย่างสุ่ม เช่นอาจได้เป็น "whGtoombnorea4k si ocp" เป็นต้น

   • string strtok ( string arg1, string arg2)
strtok() จะทำการแยกข้อความจาก arg1 เป็นข้อความย่อยโดยใช้อักขระจาก arg2 เป็น
ตัวแยกข้อความ และหากมีการเรียกใช้ฟังก์ชันนี้อีกด้วย argument เพียงตัวเดียวเป็น arg2 จะ
ทำการแยกข้อความย่อยลำดับถัดไปจากข้อความเดิม ตัวอย่างเช่นการดึงคำแต่ละคำออกจาก
ประโยคในภาษาอังกฤษ สามารถใช้ฟังก์ชัน strtok( ) โดยระบุเครื่องหมาย whitespace เป็นตัว
แยกข้อความแสดงตัวอย่างได้ดังนี้

1 <?php
2 $string = "This is\tan example\nstring";
3 /* Use tab and newline as tokenizing characters as well */
4 $tok = strtok($string, " \n\t");
5 while ($tok) {
6 echo "Word=$tok<br />";
7 $tok = strtok(" \n\t");
8 }
9 ?>

    จากตัวอย่าง การเรียกใช้ strtok( ) ในบรรทัดที่ 4 จะระบุ argument ทั้งสองตัวเริ่มต้น
ครั้งแรก และในการวนรอบคำสั่งในบรรทัดที่ 7 จะใช้ strtok( ) เพื่อดึงข้อความลำดับถัดไปซึ่งจะ
ระบุ argument เป็นตัวคั่นข้อความเพียง argument เดียว หากต้องการแยกข้อความอื่นก็สามารถ
ใช้ strtok( ) โดยระบุ argument สองตัว
ตัวอย่าง

<?php
$dataline = "23546,Tim Berton:100-555-478";
$uid = strtok($dataline,",:");
$uname = strtok(",:");
$ucode = strtok(",:");
?>

    ตัวอย่าง $addr = strtr($addr, "ฃฅ", "ขค")
หากเรียกใช้ฟังก์ชัน strtr( ) โดยมี argument เพียงสองตัว ใน argument ตัวที่สองจะกำหนดเป็น associative array ที่ใช้ key เป็นข้อความเดิมและ value เป็นข้อความใหม่ที่จะแทนการแทนจะตรวจสอบข้อความที่ตรงกับ key ที่ยาวที่สุดก่อน และข้อความส่วนที่ถูกแปลงไปแล้วจะไม่ตรวจสอบกรณีอื่นอีก ตัวอย่างเช่น

<?php
$trans = array("hello" => "hi", "hi" => "hello");
$res = strtr("hi all, I said hello", $trans);
?>

จะได้ตัวแปร $res มีข้อความ "hello all, I said hi"
      • int substr_count ( string haystack, string needle)
ฟังก์ชัน substr_count() จะแสดงจำนวนข้อความ needle ที่พบอยู่ในข้อความ haystack
ตัวอย่างเช่น substr_count("This is a test", "is") จะได้ค่า 2 คือพบคำว่า "is" 2 ครั้ง

  3 2) การแสดงผลข้อความ
    • void echo string args
     เป็นคำสั่งแสดงผลข้อความที่ได้กล่าวถึงมาในบทที่ 2 แล้ว มีลักษณะเป็นคำสั่งพิเศษที่เรียก
ว่า language construct ไม่จำเป็นต้องมีวงเล็บครอบ argument และมีจำนวน argument ที่เป็น
stringได้หลายตัวคั่นโดย comma รายละเอียดจะกล่าวถึงอีกครั้งในหัวข้อ 4.1 ในบทที่ 4
     • int print ( string arg)
    ฟังก์ชันแสดงผลข้อความ จะกล่าวถึงรายละเอียดอีกครั้งในหัวข้อ 4.1 บทที่ 4
     • void printf ( string format [, mixed args])
     คำสั่ง printf ( ) เป็นคำสั่งแสดงผลออกไปยัง browser ตามรูปแบบที่กำหนด เหมือน
ฟังก์ชัน printf( ) ในภาษา C/C++, Java เป็นคำสั่งที่เป็น language construct รายละเอียดของ
คำสั่งนี้กล่าวถึงอยู่ในหัวข้อ 4.1 ของบทที่ 4
     • string sprintf ( string format [, mixed args])
ฟังก์ชัน sprintf( ) ให้ผลข้อความที่ถูกจัดรูปแบบตามรูปแบบที่ระบุ การกำหนดรูปแบบ
เหมือนกับคำสั่ง printf( ) รายละเอียดของคำสั่งนี้แสดงอยู่ในหัวข้อ 4.1 ของบทที่ 4
WEB PROGRAMMING
Using PHP. and MySQL.110 110
      • void vprintf ( string format, array args)
ฟังก์ชัน vprintf( ) เป็นฟังก์ชันที่ใช้แสดงผลข้อมูลใน array ตามรูปแบบที่กำหนดใน format
เหมือนกับคำสั่ง printf( ) แต่จะนำข้อมูลใน array มาใช้แทนการกำหนดตัวแปรหลายตัวใน argument