ฉันจะประกาศอาร์เรย์สองมิติได้อย่างไร


93

วิธีใดง่ายที่สุดในการสร้างอาร์เรย์ 2d ฉันหวังว่าจะสามารถทำสิ่งที่คล้ายกับสิ่งนี้:

declare int d[0..m, 0..n]

คำตอบ:


81

คุณยังสามารถสร้างอาร์เรย์ที่เชื่อมโยงกันหรือ "แฮช - ตาราง" เช่นอาร์เรย์โดยการระบุดัชนีของอาร์เรย์

$array = array(
    0 => array(
        'name' => 'John Doe',
        'email' => 'john@example.com'
    ),
    1 => array(
        'name' => 'Jane Doe',
        'email' => 'jane@example.com'
    ),
);

ซึ่งเทียบเท่ากับ

$array = array();

$array[0] = array();
$array[0]['name'] = 'John Doe';
$array[0]['email'] = 'john@example.com';

$array[1] = array();
$array[1]['name'] = 'Jane Doe';
$array[1]['email'] = 'jane@example.com';

1
เราจะสร้างอาร์เรย์เดียวกันนี้โดยใช้คำสั่งวนซ้ำได้อย่างไร
Anoop Pete

@ Anoop-Pete ในตัวอย่างที่สองบล็อกที่ทำซ้ำสองบล็อกจะถูกวางลงในลูปและดัชนีตัวเลขจะถูกแทนที่ด้วยตัวแปรที่เพิ่มขึ้นในการวนซ้ำแต่ละครั้ง
Atli

1
@AnoopPete: สำหรับ ($ i = 0; $ i <count ($ array); $ i ++) {print ($ array [$ i] ['name']); }
แด็กซ์

64

สิ่งต่อไปนี้เทียบเท่าและส่งผลให้อาร์เรย์สองมิติ:

$array = array(
    array(0, 1, 2),
    array(3, 4, 5),
);

หรือ

$array = array();

$array[] = array(0, 1, 2);
$array[] = array(3, 4, 5);

7
สิ่งเหล่านี้ไม่ส่งผลให้เกิดอาร์เรย์สองมิติ แต่ส่งผลให้อาร์เรย์อาร์เรย์
dotancohen

5
@dotancohen นั่นเป็นเพียงความหมายจริงๆ ในทางปฏิบัติทั้งสองแนวคิดเหมือนกัน ความแตกต่างเพียงอย่างเดียวระหว่างสิ่งที่แสดงให้เห็นและชนิดของอาร์เรย์หลายมิติที่ใช้ในภาษาเช่น C # คือไวยากรณ์ และความแตกต่างเล็กน้อยในไวยากรณ์ที่
Atli

1
ใน C # อย่างน้อยความต้องการหน่วยความจำจะแตกต่างกัน อาร์เรย์ของอาร์เรย์จะจัดสรรเฉพาะจำนวนหน่วยความจำที่จำเป็นสำหรับแต่ละอาร์เรย์ อาร์เรย์สองมิติจะจัดสรรหน่วยความจำ N * M ทั้งหมด
dotancohen

6
@dotancohen ความต้องการหน่วยความจำระหว่าง PHP และ C # นั้นแตกต่างกันมากเนื่องจากรันไทม์ของแต่ละภาษามีวิธีจัดการหน่วยความจำของตัวเอง โดยทั่วไปแล้วไม่ใช่สิ่งที่คุณกังวลในทางปฏิบัติ ไม่เว้นเสียแต่ว่าคุณจะสร้างแอปที่ใช้งานได้ยาวนานและมีประสิทธิภาพสูงเช่นเกมซึ่งในกรณีนี้ PHP จะเป็นตัวเลือกภาษาแปลก ๆ
Atli

41

แค่ประกาศ? คุณไม่จำเป็นต้อง ตรวจสอบให้แน่ใจว่ามีตัวแปรอยู่:

$d = array();

อาร์เรย์จะถูกปรับขนาดแบบไดนามิกและพยายามที่จะเขียนสิ่งใด ๆ ไปยังองค์ประกอบที่ไม่มีระยะห่างจะสร้างขึ้น (และสร้างอาร์เรย์ทั้งหมดหากจำเป็น)

$d[1][2] = 3;

สิ่งนี้ใช้ได้กับมิติข้อมูลจำนวนเท่าใดก็ได้โดยไม่มีการประกาศล่วงหน้า


3
ยกเว้นที่บอกคุณว่าไม่มีอะไรเกี่ยวกับมิติข้อมูล หากคุณกำลังประกาศอาร์เรย์ 2 มิติ M x N โอกาสที่จะเป็นเมทริกซ์และหากเป็นโอกาสของเมทริกซ์คุณจะต้องทำการคูณหรืออะไรบางอย่างในนั้นซึ่งจะต้องทำซ้ำองค์ประกอบซึ่งคุณไม่สามารถทำได้หากเป็น "เบาบาง" และไม่รู้มิติข้อมูล
cletus

@cletus: คุณสามารถใช้countกับมิติที่ถูกต้องได้เช่นcount($d[1])เว้นแต่ฉันจะเข้าใจผิดประเด็นของคุณ?
แพะไม่พอใจ

2
อย่างไรก็ตาม PHP ไม่มีอาร์เรย์หลายมิติ ความเป็นไปได้จะออกเสมอว่าอาร์เรย์อาร์เรย์อาจเบาบาง ดังนั้นวิธีการสร้างคลาสที่ใช้เมทริกซ์โดยใช้อาร์เรย์อย่างน้อยคุณก็ต้องดูแลการใช้งานที่เหมาะสมมากขึ้น
ดอน

27

ประการแรก PHP ไม่มีอาร์เรย์หลายมิติ แต่มีอาร์เรย์ของอาร์เรย์

ประการที่สองคุณสามารถเขียนฟังก์ชันที่จะทำ:

function declare($m, $n, $value = 0) {
  return array_fill(0, $m, array_fill(0, $n, $value));
}

2
คุณไม่ได้หมายถึง "อาร์เรย์ของอาร์เรย์" แทนที่จะเป็น "อาร์เรย์หรืออาร์เรย์"
Asaph

@ อาซาฟ: ใช่ฉันทำ แก้ไขแล้ว. ขอบคุณ.
cletus

1
การตั้งค่าอาร์เรย์ของศูนย์เป็นการออกกำลังกายที่ไม่มีจุดหมายโดยสิ้นเชิง คุณไม่จำเป็นต้องประกาศอาร์เรย์เพียงแค่ใช้มัน
แพะไม่พอใจ

8
ยกเว้นว่าคุณต้องวนซ้ำหรือกำหนดขนาดเช่นถ้าคุณบอกว่ากำลังคูณเมทริกซ์ มีกรณีที่ถูกต้องอย่างสมบูรณ์สำหรับการกรอกค่าอาร์เรย์
cletus

11

สำหรับวิธีแก้ปัญหาง่ายๆแบบ "เติมเมื่อคุณไป":

$foo = array(array());

สิ่งนี้จะทำให้คุณได้รับอาร์เรย์สองมิติหลอกที่ยืดหยุ่นซึ่งสามารถเก็บ $ foo [ n ] [ n ] โดยที่n <= ∞ (แน่นอนว่าคุณถูก จำกัด ด้วยข้อ จำกัด ของขนาดหน่วยความจำตามปกติ แต่คุณก็มีความคิดที่ฉันหวังไว้) ตามทฤษฎีแล้วสามารถขยายเพื่อสร้างอาร์เรย์ย่อยได้มากเท่าที่คุณต้องการ


9

หรือสำหรับอาร์เรย์ขนาดใหญ่ทั้งหมดที่มีค่าเท่ากัน:

$m_by_n_array = array_fill(0, $n, array_fill(0, $m, $value);

จะสร้าง$mโดยอาร์เรย์กับชุดทุกอย่างเพื่อ$n$value


3

เท่าที่ฉันทราบว่าไม่มีฟังก์ชัน php ในตัวเพื่อทำสิ่งนี้คุณต้องทำผ่านการวนซ้ำหรือผ่านวิธีการที่กำหนดเองที่เรียกซ้ำไปยังบางสิ่งเช่น array_fill inidcated ในคำตอบโดย @Amber;

ฉันสมมติว่าคุณหมายถึงสร้างอาร์เรย์อาร์เรย์ว่างเปล่า แต่อินทิเรีย ตัวอย่างเช่นคุณต้องการผลลัพธ์สุดท้ายเช่นด้านล่างของอาร์เรย์ 3 อาร์เรย์ :

   $final_array = array(array(), array(), array());

นี่เป็นเรื่องง่ายเพียงแค่ใช้รหัสมือ แต่สำหรับอาร์เรย์ที่มีขนาดตามอำเภอใจเช่นอาร์เรย์ 3 อาร์เรย์จาก 3 อาร์เรย์จะเริ่มมีความซับซ้อนในการเริ่มต้นก่อนใช้งาน:

     $final_array = array(array(array(), array(), array()), array(array(), array(), array()), array(array(), array(), array()));

... ฯลฯ ...

ฉันได้รับความยุ่งยาก จะเป็นการดีที่จะมีวิธีง่ายๆในการประกาศอาร์เรย์อาร์เรย์เริ่มต้นของความลึกใด ๆ ที่จะใช้โดยไม่ต้องตรวจสอบหรือโยนข้อผิดพลาด


3

คำตอบของ atli ช่วยให้ฉันเข้าใจเรื่องนี้จริงๆ นี่คือตัวอย่างของวิธีการวนซ้ำผ่านอาร์เรย์สองมิติ ตัวอย่างนี้แสดงวิธีการค้นหาค่าสำหรับชื่อที่รู้จักของอาร์เรย์และ foreach ที่คุณเพียงแค่ไปยังฟิลด์ทั้งหมดที่คุณพบที่นั่น ฉันหวังว่ามันจะช่วยใครสักคน

$array = array(
    0 => array(
        'name' => 'John Doe',
        'email' => 'john@example.com'
    ),
    1 => array(
        'name' => 'Jane Doe',
        'email' => 'jane@example.com'
    ),
);

foreach ( $array  as $groupid => $fields) {
    echo "hi element ". $groupid . "\n";
    echo ". name is ". $fields['name'] . "\n";
    echo ". email is ". $fields['email'] . "\n";
    $i = 0;
    foreach ($fields as $field) {
         echo ". field $i is ".$field . "\n";
        $i++;
    }
}

ผลลัพธ์:

hi element 0
. name is John Doe
. email is john@example.com
. field 0 is John Doe
. field 1 is john@example.com
hi element 1
. name is Jane Doe
. email is jane@example.com
. field 0 is Jane Doe
. field 1 is jane@example.com

2

และสำหรับฉันแล้วการโต้แย้งว่าอาร์เรย์ควรเบาบางหรือไม่ขึ้นอยู่กับบริบท

ตัวอย่างเช่นหากไม่มีการเติมข้อมูล $ a [6] [9] จะเท่ากับ $ a [6] [9] ที่ถูกเติมด้วย "" หรือ 0


2
$r = array("arr1","arr2");

ในการสะท้อนองค์ประกอบอาร์เรย์เดียวคุณควรเขียน:

echo $r[0];
echo $r[1];

ผลลัพธ์จะเป็น: arr1 arr2


2
นี่คืออาร์เรย์หนึ่งมิติ อาร์เรย์หลายมิติมีอาร์เรย์ภายในอาร์เรย์เป็นอย่างน้อย
Mike Stratton

2

และฉันชอบวิธีนี้:

$cars = array
  (
  array("Volvo",22),
  array("BMW",15),
  array("Saab",5),
  array("Land Rover",17)
  );

0

หากคุณต้องการสร้างอาร์เรย์หลายมิติอย่างรวดเร็วสำหรับค่าง่ายๆโดยใช้ซับเดียวฉันขอแนะนำให้ใช้ไลบรารีอาร์เรย์นี้เพื่อทำสิ่งนี้:

$array = Arr::setNestedElement([], '1.2.3', 'value');

ซึ่งจะผลิต

[
  1 => [
    2 => [
      3 => 'value'
    ]
  ]
]

0

คุณสามารถลองสิ่งนี้ได้ แต่ค่ามิติที่สองจะเท่ากับดัชนี:

$array = array_fill_keys(range(0,5), range(0,5));

ซับซ้อนกว่าเล็กน้อยสำหรับอาร์เรย์ว่าง:

$array = array_fill_keys(range(0, 5), array_fill_keys(range(0, 5), null));


0

คุณต้องประกาศอาร์เรย์ในอาร์เรย์อื่น

$arr = array(array(content), array(content));

ตัวอย่าง:

$arr = array(array(1,2,3), array(4,5,6));

ในการรับรายการแรกจากอาร์เรย์คุณจะต้องใช้$arr[0][0]ซึ่งเหมือนกับรายการแรกจากอาร์เรย์แรกจากอาร์เรย์ $arr[1][0]จะส่งคืนรายการแรกจากอาร์เรย์ที่สองจากอาร์เรย์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.