ภาษาพีเอชพี/ประเภทของตัวแปร/Arrays

Array แก้ไข

อาเรย์ (Arrays) ตือตัวแปรที่เก็บค่าในลักษณของกลุ่มของข้อมูล โดยการจับคู่ระหว่าง ดัชนี (index, key) => ค่า (value)

รูปแบบการใช้งาน แก้ไข

การสร้าง array ใน PHP นั้นมีด้วยกัน 2 รูปแบบ

กำหนดค่าด้วย array() แก้ไข

array(  key =>  value
     , ...
    )
// key จะเป็น integer หรือ string อย่างใดอย่างหนึ่ง
// value เป็นค่าชนิดอะไรก็ได้
$arr = array("foo" => "bar", 12 => true);

echo $arr["foo"]; // bar
echo $arr[12];    // 1

โดย key นั้นอาจจะเป็น integer หรือ string อย่างใดอย่างหนึ่ง ถ้า key มีรูปแบบเหมือน integer ก็จะถูกแปลเป็น integer

  • ถ้า key เป็น "9" ก็จะแปลเป็น 9, แต่ถ้าเป็น "09" จะแปลเป็น "09" (string)

หากใส่เป็น float จะถูกตัดเป็น integer แทน โดย indexed-array และ associative-array นั้นใน PHP ถือว่าเหมือนกัน จึงทำให้สามารถมี key ได้ทั้งแบบ integer และ string ใน array ตัวเดียว

<?php
$arr = array("somearray" => array(6 => 5, 13 => 9, "a" => 42));

echo $arr["somearray"][6];    // 5
echo $arr["somearray"][13];   // 9
echo $arr["somearray"]["a"];  // 42
?>

ถ้าหากไม่มีการกำหนด key ให้กับค่าแล้ว key ของค่านั้นคือค่าสูงสุดของ integer key บวกด้วย 1 และถ้ามีการกำหนดค่าให้ key ซัำค่าใหม่จะเขียนทับค่าเก่า

<?php
// สอง array นี้มีค่าเท่ากัน
array(5 => 43, 32, 56, "b" => 12);

array(5 => 43, 6 => 32, 7 => 56, "b" => 12);

// จะมีการเขียนทับถ้า key ซ้ำกัน
$arr = array(1 => 2, 40, 50, 70, 2 => 30);
echo $arr[2]; // outputs: 30
?>

ใช้ TRUE เป็น key จะเท่ากับใช้ integer 1 หากใช้ FALSE จะเท่ากับใช้ 0 ถ้าหากใช้ NULL จะเท่ากับใช้ empty string

  • array และ object ไม่สามารถใช้เป็น key ได้

การกำหนดค่าและแก้ไขค่าด้วย วงเล็บใหญ่ [] แก้ไข

array ที่ประกาศแล้วสามารถแก้ไขค่าได้

$arr[key] = value;
$arr[] = value;
// key จะเป็น integer หรือ string อย่างใดอย่างหนึ่ง
// value เป็นค่าชนิดอะไรก็ได้

ถ้าหาก $arr ยังไม่ได้สร้างขึ้นก็จะได้รับการสร้างขึ้น

<?php
$arr = array(5 => 1, 12 => 2);

$arr[] = 56;    // แบบนี้เหมือนการใช้ $arr[13] = 56;
                // ณ จุดนี้ของโค๊ด

$arr["x"] = 42; // เป็นการเพิ่ม element ใหม่ใส่ใน array โดยมี key "x"
                
unset($arr[5]); // ลบ element นี้ออกจาก array

unset($arr);    // ลบ array ทิ้งไปเลย
?>

โดยถ้าหากเราล้างข้อมูลแล้วเหลือตัว array ไว้โดยไม่ re-index ตัว array แล้ว integer key จะต่อจากค่าสูงสุดเดิมก่อนล้างข้อมูล

<?php
// สร้าง array ใหม่
$array = array(1, 2, 3, 4, 5);
print_r($array);

// ลบทุก element เหลือไว้แต่ตัว array :
foreach ($array as $i => $value) {
    unset($array[$i]);
}
print_r($array);

// เพิ่ม element เข้าไปใหม่ (key คือ 5 ไม่ใช่ 0)
$array[] = 6;
print_r($array);

// จัดดัชนีใหม่(Re-index):
$array = array_values($array);
$array[] = 7;
print_r($array);
?>

Outputs:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Array
(
)
Array
(
    [5] => 6
)
Array
(
   [0] => 6
    [1] => 7
)

array หลายมิติ แก้ไข

array หลายมิติจะว่าคล้าย array ซ้อน array ก็ใช่ ดูจากตัวอย่างจะเข้าใจง่ายกว่า

<?php
$fruits = array ( "fruits"  => array ( "a" => "orange",
                                       "b" => "banana",
                                       "c" => "apple"
                                     ),
                  "numbers" => array ( 1,
                                       2,
                                       3,
                                       4,
                                       5,
                                       6
                                     ),
                  "holes"   => array (      "first",
                                       5 => "second",
                                            "third"
                                     )
                );

// ตัวอย่างการระบบุที่อยู่ของ array แบบ multi-dimension 
echo $fruits["holes"][5];    // prints "second"
echo $fruits["fruits"]["a"]; // prints "orange"
unset($fruits["holes"][0]);  // remove "first"

// สร้าง multi-dimensional array ตัวใหม่ขึ้น
$juices["apple"]["green"] = "good"; 
?>

ทำไม $foo[bar] ถึงผิด แก้ไข

<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>

การทำแบบนี้มันผิด แต่ว่า สามารถใช้งานได้ ที่ผิดเนื่องจากไม่มีการใส่เครื่องหมายที่ทำให้ bar เป็น string ก็เลยทำให้ PHP ไปมองหา constant ที่ชื่อ bar ก่อน แต่ที่สามารถทำงานได้เนื่องจาก เมื่อ PHP ไม่สามารถหาตัวแปรชื่อนั้น ๆ ได้จะทำการแปลงให้เป็น string แทน(ก็คือเป็น 'bar' แทน bar)

การแปลงเป็น array แก้ไข

ถ้าแปลง integer, string, float, boolean, resource จะเป็น array หนึ่ง element โดยมี key เป็น 0 และเก็บค่าตัวแปรนั้นไว้ หรือจะบอกได้ว่า (array)$scalarValue เหมือน array($scalarValue) นั้นเอง

แปลงจาก object ผลที่ได้คือ element ของ array ก็ได้จาก property ของ object โดยชื่อตัวแปรจะเป็น key

แปลง NULL จะมีค่าเท่ากับ empty array

การเปรียบเทียบ array กับ array แก้ไข

สามารถเทียบได้โดยใช้ array_diff() หรือใช้ array operator

ตัวอย่างเพิ่มเติม แก้ไข

ใน PHP นั้น array นั้นมีสามารถใช้งานให้เกิดประโยชน์ได้มากมาย

<?php
// การทำแบบนี้
$a = array( 'color' => 'red',
            'taste' => 'sweet',
            'shape' => 'round',
            'name'  => 'apple',
            4        // key จะเป็น 0
          );

$b = array('a', 'b', 'c');

// มีค่าเหมือนการทำแบบนี้
$a = array();
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name']  = 'apple';
$a[]        = 4;        // key will be 0

$b = array();
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';

// After the above code is executed, $a will be the array
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round', 
// 'name' => 'apple', 0 => 4), and $b will be the array 
// array(0 => 'a', 1 => 'b', 2 => 'c'), or simply array('a', 'b', 'c').
?>
<?php
// Array เป็น (property-)map
$map = array( 'version'    => 4,
              'OS'         => 'Linux',
              'lang'       => 'english',
              'short_tags' => true
            );
            
// ใช้รูปแบบ number index
$array = array( 7,
                8,
                0,
                156,
                -10
              );
// มีค่าเท่ากับ array(0 => 7, 1 => 8, ...)

$switching = array(         10, // key = 0
                    5    =>  6,
                    3    =>  7, 
                    'a'  =>  4,
                            11, // key = 6 (ค่า integer index สูงสุดคือ 5)
                    '8'  =>  2, // key = 8 (integer!)
                    '02' => 77, // key = '02'
                    0    => 12  // ค่า 10 จะถูกเขียนทับ 12
                  );
                  
// empty array 
$empty = array();         
?>

สามารถคัดลอก array ได้ด้วยการใช้ reference operator (ในที่นี้คือ &)

<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 is changed,
             // $arr1 is still array(2, 3)
             
$arr3 = &$arr1; // จะเท่ากับให้ $arr3 เป็นตัวเดียวกันกับ $arr1 (เนื่องจากให้ $arr3 ไปชี้ตำแหน่ง memory เดียวกันกับ $arr1)
$arr3[] = 4; // เป็นการกำหนดค่าให้ $arr1 ด้วย

echo $arr1[0]; // output: 2
echo $arr1[1]; // output: 3
echo $arr1[2]; // output: 4
?>