Bagaimana cara mendeklarasikan array dua dimensi?

92

Apa cara termudah untuk membuat array 2d. Saya berharap dapat melakukan sesuatu yang serupa dengan ini:

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

Jawaban:

81

Anda juga dapat membuat array asosiatif, atau array seperti "tabel-hash", dengan menentukan indeks dari array.

$array = array(
    0 => array(
        'name' => 'John Doe',
        'email' => '[email protected]'
    ),
    1 => array(
        'name' => 'Jane Doe',
        'email' => '[email protected]'
    ),
);

Yang mana setara dengan

$array = array();

$array[0] = array();
$array[0]['name'] = 'John Doe';
$array[0]['email'] = '[email protected]';

$array[1] = array();
$array[1]['name'] = 'Jane Doe';
$array[1]['email'] = '[email protected]';
Atli
sumber
1
Bagaimana kita bisa membuat array yang sama ini menggunakan pernyataan perulangan?
Anoop Pete
@ Anoop-Pete Dalam potongan kedua, dua blok berulang akan ditempatkan ke dalam loop dan indeks numerik diganti dengan variabel yang bertambah setiap iterasi.
Atli
1
@AnoopPete: untuk ($ i = 0; $ i <count ($ array); $ i ++) {print ($ array [$ i] ['name']); }
Dax
64

Berikut ini adalah ekuivalen dan menghasilkan array dua dimensi:

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

atau

$array = array();

$array[] = array(0, 1, 2);
$array[] = array(3, 4, 5);
David Snabel-Caunt
sumber
7
Itu tidak menghasilkan larik dua dimensi, melainkan menghasilkan larik larik.
dotancohen
5
@dotancohen Itu hanya semantik, sungguh. Praktis kedua konsep itu sama. Satu-satunya perbedaan antara apa yang didemonstrasikan di sana dan jenis array multi-dimensi yang digunakan dalam bahasa seperti C # adalah sintaks. Dan perbedaan sintaks yang cukup kecil pada saat itu.
Atli
1
Setidaknya dalam C #, kebutuhan memori berbeda. Sebuah array dari array hanya mengalokasikan jumlah memori yang dibutuhkan untuk setiap array. Array dua dimensi mengalokasikan seluruh memori N * M.
dotancohen
6
@dotancohen Persyaratan memori antara PHP dan C # secara umum sangat berbeda, karena setiap runtime bahasa memiliki caranya sendiri dalam menangani memori. Ini umumnya bukan sesuatu yang Anda khawatirkan dalam praktiknya. Tidak, kecuali jika Anda kebetulan sedang membangun semacam aplikasi berkinerja tinggi yang berjalan lama, seperti game, dalam hal ini PHP akan menjadi pilihan bahasa yang aneh.
Atli
41

Nyatakan saja? Anda tidak perlu melakukannya. Pastikan variabel ada:

$d = array();

Array diubah ukurannya secara dinamis, dan mencoba untuk menulis apa pun ke elemen non-exsistant membuatnya (dan membuat seluruh larik jika diperlukan)

$d[1][2] = 3;

Ini berlaku untuk sejumlah dimensi tanpa pernyataan sebelumnya.

Kornel
sumber
3
Kecuali itu tidak memberi tahu Anda tentang dimensi. Jika Anda mendeklarasikan array M x N 2D, kemungkinan itu adalah matriks dan jika itu adalah matriks, kemungkinan besar Anda akan melakukan perkalian atau sesuatu di atasnya yang memerlukan iterasi atas elemen, yang tidak dapat Anda lakukan jika itu "jarang" dan tidak tahu dimensinya.
cletus
@cletus: Anda hanya dapat menggunakan countpada dimensi yang tepat, misalnya count($d[1]), kecuali saya salah memahami maksud Anda?
DisgruntledGoat
2
Namun, PHP tidak memiliki array multi-dimensi. Kemungkinan akan selalu keluar bahwa larik larik mungkin jarang. Jadi, bagaimana kalau membuat kelas yang mengimplementasikan matriks menggunakan array, setidaknya Anda akan lebih berhati-hati dalam implementasi yang tepat.
Jangan
26

Pertama, PHP tidak memiliki array multi-dimensi, ia memiliki array array.

Kedua, Anda dapat menulis fungsi yang akan melakukannya:

function declare($m, $n, $value = 0) {
  return array_fill(0, $m, array_fill(0, $n, $value));
}
cletus
sumber
2
Anda tidak berarti "array dari array", bukan "array atau array"?
Asaf
@ Asaph: ya saya lakukan. Tetap. Terima kasih.
cletus
1
Menyiapkan serangkaian angka nol adalah latihan yang sama sekali tidak berguna. Anda tidak perlu mendeklarasikan sebuah array, gunakan saja.
DisgruntledGoat
8
Kecuali jika Anda perlu mengulanginya atau menentukan ukurannya seperti jika Anda mengatakan melakukan perkalian matriks. Ada kasus yang benar-benar valid untuk mengisi nilai array.
cletus
11

Untuk solusi sederhana, "isi sesuai penggunaan":

$foo = array(array());

Ini akan memberi Anda larik dua dimensi semu fleksibel yang dapat menampung $ foo [ n ] [ n ] di mana n <= ∞ (tentu saja Anda dibatasi oleh batasan ukuran memori yang biasa, tetapi Anda mendapatkan ide yang saya harap). Secara teori, hal ini dapat diperpanjang untuk membuat sub array sebanyak yang Anda butuhkan.

Kingsolmn
sumber
9

Atau untuk array yang lebih besar, semuanya dengan nilai yang sama:

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

akan menciptakan $moleh $narray dengan segala set ke $value.

Amber
sumber
3

Sejauh yang saya tahu tidak ada fungsi php built in untuk melakukan ini, Anda perlu melakukannya melalui loop atau melalui metode kustom yang secara rekursif memanggil sesuatu seperti array_fill yang dimasukkan dalam jawaban oleh @Amber;

Saya berasumsi maksud Anda membuat array kosong tapi diinisialisasi array. Misalnya, Anda menginginkan hasil akhir seperti di bawah ini dari array 3 array :

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

Ini sederhana untuk hanya memasukkan kode, tetapi untuk larik berukuran arbitrer seperti larik 3 larik dari 3 larik itu mulai menjadi rumit untuk diinisialisasi sebelum digunakan:

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

... dll ...

Saya mendapatkan frustrasi. Alangkah baiknya memiliki cara mudah untuk mendeklarasikan array yang diinisialisasi dari kedalaman apa pun untuk digunakan tanpa memeriksa atau melempar kesalahan.

sinar
sumber
3

jawaban atli sangat membantu saya memahami ini. Berikut adalah contoh cara melakukan iterasi melalui array dua dimensi. Contoh ini menunjukkan cara menemukan nilai untuk nama yang diketahui dari sebuah array dan juga foreach di mana Anda hanya menelusuri semua bidang yang Anda temukan di sana. Saya harap ini membantu seseorang.

$array = array(
    0 => array(
        'name' => 'John Doe',
        'email' => '[email protected]'
    ),
    1 => array(
        'name' => 'Jane Doe',
        'email' => '[email protected]'
    ),
);

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

Keluaran:

hi element 0
. name is John Doe
. email is [email protected]
. field 0 is John Doe
. field 1 is [email protected]
hi element 1
. name is Jane Doe
. email is [email protected]
. field 0 is Jane Doe
. field 1 is [email protected]
James Burnett
sumber
2

Dan bagi saya argumen tentang apakah sebuah array harus jarang atau tidak tergantung pada konteksnya.

Misalnya, jika $ a [6] [9] tidak terisi sama dengan $ a [6] [9] yang diisi misalnya dengan "" atau 0.

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

untuk menggemakan satu elemen array, Anda harus menulis:

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

keluarannya adalah: arr1 arr2

Deshal Kh
sumber
2
Ini adalah larik satu dimensi. Sebuah array multidimensi memiliki paling sedikit, sebuah array di dalam sebuah array.
Mike Stratton
2

Dan saya suka cara ini:

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

Jika Anda ingin dengan cepat membuat array multidimensi untuk nilai sederhana menggunakan satu liner, saya akan merekomendasikan menggunakan library array ini untuk melakukannya seperti ini:

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

yang akan menghasilkan

[
  1 => [
    2 => [
      3 => 'value'
    ]
  ]
]
Pekerjaan mini
sumber
0

Anda dapat mencoba ini, tetapi nilai dimensi kedua akan sama dengan indeks:

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

sedikit lebih rumit untuk array kosong:

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

Denis Ivanov
sumber
0

Anda perlu mendeklarasikan sebuah array di array lain.

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

Contoh:

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

Untuk mendapatkan item pertama dari array, Anda akan menggunakan $arr[0][0], itu seperti item pertama dari array pertama dari array. $arr[1][0]akan mengembalikan item pertama dari larik kedua dari larik.

mmateas
sumber