อาเรย์ - กลุ่มของตัวแปร

Array คือ กลุ่มของตัวแปร ใน PHP แบ่งออกเป็น 3 กลุ่ม คล้าย ๆ กับภาษาอื่น คือ

  • Numberic Array ใช้ตัวเลข (index) ระบุตำแหน่งใน array
  • Associative Array ใช้คำบอกตำแหน่ง array ในบางภาษาเรียก array ลักษณะนี้ว่า dictionary
  • Multidimensional Array เป็น array ซ้อน array

Numberic Arrays

เริ่มนับจาก 0 เป็น index ของ array ตัวแรก

    <?php

    // Create array
    $characters = array('Zidane', 'Vivi', 'Steiner', 'Garnet', 'Freya', 'Quina', 'Eiko');

    // Get value
    echo $characters[1] . ' is black mage'; // print: Vivi is black mage

    // Add more value into array at last point
    $characters[] = 'Amarant';

    // Change value in array
    $characters[3] = 'Dagger';
    echo $characters[3]; // print: Dagger

    // Count item in array
    echo count($characters); // print: 8

Associative Arrays

จะใช้ คำ (key) แทน ตัวเลข (index) ทำให้มันมีความหมายในตัวเอง เข้าใจง่าย เรียกใช้ง่าย

    <?php

    $eidolon = 'phoenix';

    // Create array
    $skills = array(
        'fenrir'   => 'Terrestrial Rage',
        'phoenix'  => 'Rebirth Flame',
        'cabuncle' => 'Ruby Light',
    );

    // Get value
    echo $eidolon . ' use skill ' . $skills[$eidolon];

    // Add more item
    $skills['madeen'] = 'Terra Homing';

    // Change value
    $skills['fenrir'] = 'Millennial Decay';

Multidimensional Arrays

พูดง่าย ๆ คือ การใช้ array เป็นค่าใน array อีกตัวหนึ่งนั่นเอง

    <?php

    $weapons = array(
        'garnet' => array('Rod', 'Racket'),
        'eiko'   => array('Flutes', 'Racket')
    );
    // print: Garnet primary weapon is Rod
    echo 'Garnet primary weapon is ' . $weapons['garnet'][0];

    // print: $weapons have 2 elements
    echo '$weapons have ' . count($weapons) . ' elements';

    // print: $weapons have 6 elements (with inside array)
    echo '$weapons have ' . count($weapons, 1) . ' elements (with inside array)';

Array Splice

ใน PHP ตัวแปรชุดแบบอาร์เรย์นั้นจะถูก implement ด้วย hash table ทั้งหมด นี่อาจเป็นข้อดีในแง่ความสะดวก แต่ถ้าหากเราลองทำอะไรอย่างนี้

    <?php

    $arr = array('a', 'b', 'c', 'd');
    unset($arr[2]);

    var_dump($arr);
    // output:
    //   array(4) {
    //     [0]=>
    //     string(1) "a"
    //     [1]=>
    //     string(1) "b"
    //     [3]=>
    //     string(1) "d"
    //   }

จะพบว่าตัวที่ถูก unset ไปนั้น กลายเป็นรูโหว่ๆ อยู่กลางอาร์เรย์ โดยที่ index ของ element ใน array ไม่เลื่อนลงมาถมช่องโหว่ให้เต็ม

ทางแก้นอกจากเลี่ยงไปใช้การวนแบบ foreach แทนแล้ว ในสถานการณ์ที่เลข index มีความสำคัญ (ต้องเลื่อนไปถมให้เต็ม) ก็มี array_splice สำหรับงานนี้ครับ

    <?php

    $arr = array('a', 'b', 'c', 'd');
    array_splice($arr, 2, 1);

    var_dump($arr);
    // output:
    //   array(3) {
    //     [0]=>
    //     string(1) "a"
    //     [1]=>
    //     string(1) "b"
    //     [2]=>
    //     string(1) "d"
    //   }

สำหรับ argument ที่ให้กับ array_splice จะมีอยู่ทั้งหมด 4 ตัว โดยบังคับใส่อย่างน้อย 2 ตัวได้แก่อาร์เรย์ที่จะเปลี่ยนแปลง และตำแหน่งเริ่มต้นที่จะลบตัวแปรในอาร์เรย์ทิ้ง

    <?php

    $arr = array('a', 'b', 'c', 'd');
    array_splice($arr, 2);
    // now $arr is array('a', 'b')

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

    <?php

    $arr = array('a', 'b', 'c', 'd');
    array_splice($arr, 1, 1);

    $arr = array('a', 'b', 'c', 'd');
    array_splice($arr, 1, -2);

    // both $arr is array('a', 'c', 'd')

ส่วน argument ตัวสุดท้ายคืออาร์เรย์ที่จะนำเข้ามาแทรกลงในตำแหน่งที่ลบไป และเนื่องจากเราไม่สามารถข้าม argument ตัวที่ 3 ได้ ดังนั้นถ้าต้องการลบอาร์เรย์ต้นฉบับทิ้งจนสุดแล้วค่อยต่อท้ายด้วยอาร์เรย์ใหม่ ให้ใส่ argument ตัวที่ 3 เป็น count เพื่อให้มั่นใจว่าลบตัวแปรทิ้งจนหมดก็ได้

    <?php

    $arr = array('a', 'b', 'c', 'd');
    array_splice($arr, 2, 0, array('z', 'y'));
    // now $arr is array('a', 'b', 'z', 'y', 'c', 'd')

    $arr = array('a', 'b', 'c', 'd');
    array_splice($arr, 1, count($arr), array('e', 'i'));
    // now $arr is array('a', 'e', 'i')

อย่างไรก็ตาม แม้ว่าเราจะสามารถใช้เครื่องมือเหล่านี้เพื่อสร้างอาร์เรย์ที่รักษาการเรียงลำดับตัวเลขไว้ได้ แต่โดยพื้นฐานของมันแล้ว มันไม่ได้ implement มาเพื่องานเช่นนี้โดยเฉพาะ ถ้าต้องการทำงานเช่นนี้โดยที่ยังคงประสิทธิภาพไว้อยู่ อาจพิจรณาการ implement แบบ linked list แทนครับ

Nattawut Phetmak

Jack of all Trades

blog comments powered by Disqus