İki boyutlu bir diziyi nasıl açıklarım?


92

2d dizisi oluşturmanın en kolay yolu nedir? Buna benzer bir şey yapmayı umuyordum:

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

Yanıtlar:


81

Ayrıca, dizinin dizinini belirterek bir ilişkilendirilebilir dizi veya "karma tablo" benzeri bir dizi oluşturabilirsiniz.

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

Eşdeğeri

$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
Döngü ifadelerini kullanarak aynı diziyi nasıl yaratabiliriz?
Anoop Pete

@ Anoop-Pete İkinci kod parçacığında, iki yinelenen blok döngü içine yerleştirilir ve sayısal indeks, her yinelemede artırılan bir değişkenle değiştirilir.
Atlı

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

64

Aşağıdakiler eşdeğerdir ve iki boyutlu bir dizi ile sonuçlanır:

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

veya

$array = array();

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

7
Bunlar iki boyutlu dizilerle sonuçlanmaz, daha çok bir dizi dizisiyle sonuçlanır.
dotancohen

5
@dotancohen Bu sadece anlambilim, gerçekten. Pratik olarak iki kavram aynıdır. Orada gösterilenler ile C # gibi dillerde kullanılan çok boyutlu diziler arasındaki tek fark sözdizimidir. Ve söz diziminde oldukça küçük bir fark var.
Atli

1
En azından C #'da bellek gereksinimleri farklıdır. Bir dizi dizisi, yalnızca her dizi için gereken bellek miktarını ayırır. İki boyutlu bir dizi, belleğin tüm N * M'sini ayırır.
dotancohen

6
@dotancohen PHP ve C # arasındaki bellek gereksinimleri genel olarak çok farklıdır, çünkü her dilin çalışma zamanı kendi belleği işleme yöntemine sahiptir. Genellikle pratikte ilgilendiğiniz bir şey değildir. Oyun gibi uzun süre çalışan, yüksek performanslı bir uygulama geliştirmediğiniz sürece, bu durumda PHP tuhaf bir dil seçimi olacaktır.
Atli

41

Sadece ilan mı? Mecbur değilsin. Değişkenin var olduğundan emin olun:

$d = array();

Diziler dinamik olarak yeniden boyutlandırılır ve var olmayan öğeye herhangi bir şey yazma girişimi onu oluşturur (ve gerekirse tüm diziyi oluşturur)

$d[1][2] = 3;

Bu, önceden bildirim olmaksızın herhangi bir sayıda boyut için geçerlidir.


3
Bunun size boyutlar hakkında hiçbir şey söylememesi dışında. Bir M x N 2D dizisi ilan ediyorsanız, bu bir matris olabilir ve bir matris ise, çarpma veya üzerinde elemanlar üzerinde yinelemeyi gerektirecek bir şey yapacaksınız, eğer öyleyse yapamazsınız "seyrek" ve boyutları bilmiyor.
cletus

@cletus: countDoğru boyutta kullanabilirsin , örneğin count($d[1]), senin fikrini yanlış anlamıyorsam?
DisgruntledGoat

2
Yine de PHP'nin çok boyutlu dizileri yoktur. Olasılık her zaman bir dizi dizisinin seyrek olabileceğinden çıkacaktır. Öyleyse, dizileri kullanarak bir matris uygulayan bir sınıf yapmaya ne dersiniz, en azından o zaman doğru uygulamaya daha çok dikkat edersiniz.
Don

26

İlk olarak, PHP'nin çok boyutlu dizileri yoktur, dizilerden oluşan dizileri vardır.

İkinci olarak, bunu yapacak bir işlev yazabilirsiniz:

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

2
Eğer "diziler anlamına etmeyin ait yerine" Dizilerin diziler " ya da diziler"?
Asaph

@Asaph: evet yaptım. Sabit. Teşekkürler.
cletus

1
Bir dizi sıfır oluşturmak tamamen anlamsız bir egzersizdir. Bir dizi bildirmenize gerek yok, sadece onu kullanın.
DisgruntledGoat

8
Bunu yinelemeniz veya matris çarpımı yapıyormuşsunuz gibi boyutunu belirlemeniz gerekmesi dışında . Dizi değerlerini doldurmak için tamamen geçerli bir durum var.
cletus

11

Basit, "giderken doldurun" türü bir çözüm için:

$foo = array(array());

Bu size $ foo [ n ] [ n ] 'yi n <= ∞ tutabilen esnek sözde iki boyutlu bir dizi verecektir (elbette bellek boyutunun olağan kısıtlamaları ile sınırlandırılırsınız, ama umduğum fikri anladınız). Bu, teoride ihtiyaç duyduğunuz sayıda alt dizi oluşturmak için genişletilebilir.


9

Veya tümü aynı değere sahip daha büyük diziler için:

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

Bir yaratacak $mtarafından $nher şeyi seti ile dizide $value.


3

Bildiğim kadarıyla bunu yapmak için yerleşik bir php işlevi bulunmuyor, bunu bir döngü veya @Amber tarafından yanıtta belirtilen dizi_fill gibi bir şeyi özyinelemeli olarak çağıran özel bir yöntem aracılığıyla yapmanız gerekir;

Boş ama önceden hazırlanmış bir dizi dizisi yarattığınızı varsayıyorum. Örneğin, 3 diziden oluşan bir dizinin aşağıdaki gibi nihai sonuçlarını istiyorsunuz :

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

Bu sadece kodu elden geçirmek basittir, ancak 3 diziden oluşan 3 diziden oluşan bir dizi gibi gelişigüzel boyutlu bir dizi için, kullanımdan önce başlatmak karmaşıklaşmaya başlar:

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

...vb...

Hayal kırıklığı yaşıyorum. Hataları kontrol etmeden veya atmadan kullanmak için herhangi bir derinlikte başlatılmış dizileri bildirmenin kolay bir yolunu bulmak güzel olurdu.


3

atli'nin cevabı bunu anlamama gerçekten yardımcı oldu. İşte iki boyutlu bir dizide nasıl yineleme yapılacağına dair bir örnek. Bu örnek, bir dizinin bilinen adları için değerleri nasıl bulacağınızı ve ayrıca orada bulduğunuz tüm alanlardan geçtiğiniz bir foreach'ı gösterir. Umarım birine yardımcı olur.

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

Çıktılar:

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

Ve benim için bir dizinin seyrek olup olmayacağı hakkındaki argüman bağlama bağlıdır.

Örneğin, $ a [6] [9] doldurulmamışsa, örneğin "" veya 0 ile doldurulan $ a [6] [9] ile eşdeğerdir.


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

tek bir dizi öğesini yankılamak için yazmanız gerekir:

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

çıktı: arr1 arr2


2
Bu tek boyutlu bir dizidir. Çok boyutlu bir dizi, en azından bir dizi içinde bir diziye sahiptir.
Mike Stratton

2

Ve bu şekilde seviyorum:

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

0

Tek bir satır kullanarak basit bir değer için çok boyutlu diziyi hızlı bir şekilde oluşturmak istiyorsanız, şu şekilde yapmak için bu dizi kitaplığını kullanmanızı tavsiye ederim :

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

hangisi üretecek

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

0

Bunu deneyebilirsiniz, ancak ikinci boyut değerleri dizinlere eşit olacaktır:

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

boş dizi için biraz daha karmaşık:

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


0

Başka bir dizide bir dizi tanımlamanız gerekir.

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

Misal:

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

Diziden ilk öğeyi almak için kullanacaksınız $arr[0][0], bu dizideki ilk dizideki ilk öğe gibi . dizideki ikinci dizideki $arr[1][0]ilk öğeyi döndürür .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.