Làm cách nào để khai báo một mảng hai chiều?


91

Cách dễ nhất để tạo mảng 2d là gì. Tôi đã hy vọng có thể làm điều gì đó tương tự như thế này:

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

Câu trả lời:


81

Bạn cũng có thể tạo một mảng kết hợp hoặc một "bảng băm" giống như mảng, bằng cách chỉ định chỉ mục của mảng.

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

Tương đương với

$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
Làm thế nào chúng ta có thể tạo cùng một mảng này bằng cách sử dụng các câu lệnh lặp?
Anoop Pete

@ Anoop-Pete Trong đoạn mã thứ hai, hai khối lặp lại sẽ được đặt vào vòng lặp và chỉ mục số được thay thế bằng một biến được tăng lên mỗi lần lặp.
Atli

1
@AnoopPete: for ($ i = 0; $ i <count ($ array); $ i ++) {print ($ array [$ i] ['name']); }
Dax

64

Những điều sau là tương đương và kết quả là một mảng hai chiều:

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

hoặc là

$array = array();

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

7
Những điều đó không dẫn đến mảng hai chiều, mà là kết quả của một mảng mảng.
dotancohen

5
@dotancohen Đó chỉ là ngữ nghĩa, thực sự. Thực tế thì hai khái niệm này giống nhau. Sự khác biệt duy nhất giữa những gì được trình bày ở đó và loại mảng đa chiều được sử dụng trong các ngôn ngữ như C # là cú pháp. Và một sự khác biệt khá nhỏ về cú pháp ở đó.
Atli

1
Trong C # ít nhất, các yêu cầu bộ nhớ là khác nhau. Một mảng mảng chỉ cấp phát lượng bộ nhớ cần thiết cho mỗi mảng. Mảng hai chiều phân bổ toàn bộ N * M bộ nhớ.
dotancohen

6
@dotancohen Nhìn chung, yêu cầu bộ nhớ giữa PHP và C # rất khác nhau, vì thời gian chạy của mỗi ngôn ngữ có cách xử lý bộ nhớ riêng. Nó thường không phải là điều bạn quan tâm trong thực tế. Không trừ khi bạn tình cờ xây dựng một số loại ứng dụng chạy lâu, hiệu suất cao, chẳng hạn như một trò chơi, trong trường hợp đó PHP sẽ là một lựa chọn ngôn ngữ kỳ quặc.
Atli

40

Chỉ cần khai báo? Bạn không cần phải làm vậy. Chỉ cần đảm bảo rằng biến tồn tại:

$d = array();

Mảng được thay đổi kích thước động và cố gắng ghi bất kỳ thứ gì vào phần tử không tồn tại sẽ tạo ra nó (và tạo toàn bộ mảng nếu cần)

$d[1][2] = 3;

Điều này hợp lệ cho bất kỳ số lượng thứ nguyên nào mà không cần khai báo trước.


3
Ngoại trừ điều đó cho bạn biết không có gì về các kích thước. Nếu bạn đang khai báo một mảng M x N 2D, rất có thể đó là một ma trận và nếu đó là một ma trận, rất có thể bạn đang thực hiện phép nhân hoặc một cái gì đó trên đó sẽ yêu cầu lặp lại các phần tử, điều mà bạn không thể làm nếu "thưa thớt" và không biết kích thước.
cletus

@cletus: bạn chỉ có thể sử dụng countđúng chiều, ví dụ count($d[1]), trừ khi tôi hiểu sai ý của bạn?
DisgruntledGoat

2
Tuy nhiên, PHP không có mảng đa chiều. Khả năng sẽ luôn thoát ra rằng một mảng mảng có thể thưa thớt. Vì vậy, làm thế nào về việc tạo một lớp triển khai ma trận bằng cách sử dụng mảng, ít nhất sau đó bạn sẽ quan tâm hơn đến việc triển khai đúng cách.
Don

26

Thứ nhất, PHP không có mảng đa chiều, nó có các mảng của mảng.

Thứ hai, bạn có thể viết một hàm sẽ làm điều đó:

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

2
Ý bạn không phải là "mảng của mảng", thay vì "mảng hoặc mảng"?
Asaph

@Asaph: vâng, tôi đã làm. Đã sửa. Cảm ơn.
cletus

1
Thiết lập một mảng các số 0 là một bài tập hoàn toàn vô nghĩa. Bạn không cần khai báo mảng mà chỉ cần sử dụng nó.
DisgruntledGoat

7
Ngoại trừ trường hợp bạn cần lặp lại nó hoặc xác định kích thước của nó như thể bạn đang nói thực hiện phép nhân ma trận. Có một trường hợp hoàn toàn hợp lệ để điền các giá trị mảng.
cletus

11

Đối với một loại giải pháp đơn giản, "điền khi bạn thực hiện":

$foo = array(array());

Điều này sẽ giúp bạn có được một mảng hai chiều giả linh hoạt có thể chứa $ foo [ n ] [ n ] trong đó n <= ∞ (tất nhiên là của bạn bị giới hạn bởi các ràng buộc thông thường về kích thước bộ nhớ, nhưng tôi hy vọng bạn sẽ có được ý tưởng). Về lý thuyết, điều này có thể được mở rộng để tạo ra nhiều mảng con như bạn cần.


9

Hoặc đối với các mảng lớn hơn, tất cả đều có cùng giá trị:

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

sẽ tạo ra một $mbằng $nmảng với tất cả mọi thứ thiết lập để $value.


3

Theo như tôi biết thì không có hàm php nào được tích hợp sẵn để thực hiện việc này, bạn cần thực hiện nó thông qua một vòng lặp hoặc thông qua một phương thức tùy chỉnh gọi đệ quy đến một cái gì đó như array_fill inidcated trong answer by @Amber;

Tôi giả sử ý bạn là đã tạo một mảng mảng rỗng nhưng phức tạp. Ví dụ: bạn muốn kết quả cuối cùng giống như bên dưới của một mảng gồm 3 mảng :

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

Điều này rất đơn giản để chỉ viết tay mã, nhưng đối với một mảng có kích thước tùy ý như một mảng 3 mảng 3 mảng thì việc khởi tạo trước khi sử dụng bắt đầu phức tạp:

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

...Vân vân...

Tôi nhận được sự thất vọng. Sẽ rất tuyệt nếu có một cách dễ dàng để khai báo một mảng đã khởi tạo của mảng bất kỳ độ sâu nào để sử dụng mà không cần kiểm tra hoặc ném lỗi.


3

Câu trả lời của atli thực sự đã giúp tôi hiểu điều này. Đây là một ví dụ về cách lặp qua một mảng hai chiều. Mẫu này cho thấy cách tìm các giá trị cho các tên đã biết của một mảng và cũng là phần mở đầu mà bạn chỉ cần xem qua tất cả các trường mà bạn tìm thấy ở đó. Tôi hi vọng nó giúp ích cho ai đó.

$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++;
    }
}

Kết quả đầu ra:

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

Và đối với tôi, tranh luận về việc một mảng có nên thưa thớt hay không phụ thuộc vào ngữ cảnh.

Ví dụ: nếu $ a [6] [9] không được điền thì tương đương với $ a [6] [9] được điền ví dụ với "" hoặc 0.


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

để lặp lại một phần tử mảng duy nhất, bạn nên viết:

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

đầu ra sẽ là: arr1 arr2


2
Đây là một mảng một chiều. Mảng nhiều chiều có ít nhất một mảng trong một mảng.
Mike Stratton

2

Và tôi thích cách này:

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

0

Nếu bạn muốn nhanh chóng tạo mảng nhiều chiều cho giá trị đơn giản bằng cách sử dụng một lớp lót, tôi khuyên bạn nên sử dụng thư viện mảng này để thực hiện như sau:

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

cái nào sẽ sản xuất

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

0

Bạn có thể thử điều này, nhưng các giá trị của thứ nguyên thứ hai sẽ bằng với chỉ mục:

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

phức tạp hơn một chút cho mảng trống:

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


0

Bạn cần khai báo một mảng trong một mảng khác.

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

Thí dụ:

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

Để lấy mục đầu tiên từ mảng, bạn sẽ sử dụng $arr[0][0], nó giống như mục đầu tiên từ mảng đầu tiên từ mảng. $arr[1][0]sẽ trả về mục đầu tiên từ mảng thứ hai từ mảng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.