GORAGOD.com

วิธีการสร้างแอเรย์หลายมิติด้วย PHP

ภาษาอื่นๆ สามารถสร้างแอเรย์หลายมิติได้ง่ายๆ
ภาษา C
int array[10][10];

Phython
arr = [[0 for i in range(10)] for j in range(10)]

Javascript
const = new Array(10).fill(0).map(() => new Array(10).fill(0))

ลองมาดู ภาษา PHP กันบ้าง
$array = array();
for ($a = 0; $a <= 10; $a++) {
    for ($b = 0; $b <= 10; $b++) {
        $array[$a][$b] = 0;
    }
}
จะยาวไปไหน
มาเข้าเรื่องของบทความนี้กัน จริงๆ PHP ก็สามารถสร้างแอเรย์หลายมิติได้หลายวิธี สิ่งที่ผมอยากรู้คือ วิธีไหนมีประสิทธิภาพมากที่สุด

วิธีแรก
$array = array();
for ($a = 0; $a <= 10; $a++) {
    for ($b = 0; $b <= 10; $b++) {
        $array[$a][$b] = 0;
    }
}

วิธีที่สอง
function second_array($n)
{
    return array_fill(0, 11, 0);
}
$array = array_map('second_array', range(0, 10));

วิธีที่สาม
$array = array_fill(0, 11, array_fill(0, 11, 0));
วิธีสั้นๆ ก็มีเนาะ

ลองมาดูโค้ดที่ผมใช้ในการทดสอบความเร็วกัน
// วิธีแรก
$start = microtime(true);
$array = array();
for ($a = 0; $a <= 10; $a++) {
    for ($b = 0; $b <= 10; $b++) {
        $array[$a][$b] = 0;
    }
}
echo '<br><br><br>วิธีแรก '.(microtime(true) - $start);
// print_r($array);
unset($array);

// วิธีที่สอง
$start = microtime(true);
function second_array($n)
{
    return array_fill(0, 11, 0);
}
$array = array_map('second_array', range(0, 10));
echo '<br><br><br>วิธีที่สอง '.(microtime(true) - $start);
// print_r($array);
unset($array);

// วิธีที่สาม
$start = microtime(true);
$array = array_fill(0, 11, array_fill(0, 11, 0));
echo '<br><br><br>วิธีที่สาม '.(microtime(true) - $start);
// print_r($array);
unset($array);

ผลลัพท์การทดสอบความเร็ว
วิธีแรก 0.03814697265625
วิธีที่สอง 0.02598762512207
วิธีที่สาม 0.0030994415283203

จะเห็นว่าการวนลูป (วิธีแรก) เป็นวิธีที่ช้ามาก และวิธีที่สาม เป็นวิธีที่เร็วสุดๆ
อธิบายเพิ่มเติม
  • สามารถดูผลลัพท์ของแต่ละคำสั่งได้โดยใช้คำสัง print_r($array) ที่ comment ไว้
  • ตัวอย่างที่ใช้ในการทดสอบมีการกำหนดผลลัพท์ของแอเรย์ให้เป็น 0 ทุกรายการ
  • ในกรณีที่ต้องการกำหนดค่าของแอเรย์เป็นอย่างอื่น ผลการทดสอบอาจแตกต่างจากนี้ เนื่องจากวิธีที่สามอาจจะใช้ไม่ได้ (วิธีวนลูปอาจเร็วที่สุดก็ได้)