Jak zadeklarować dwuwymiarową tablicę?

93

Jaki jest najłatwiejszy sposób na utworzenie tablicy 2D. Miałem nadzieję, że uda mi się zrobić coś podobnego do tego:

declare int d[0..m, 0..n]
Maska
źródło

Odpowiedzi:

81

Możesz także utworzyć tablicę asocjacyjną lub tablicę typu "hash-table", określając indeks tablicy.

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

Co jest równoważne

$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
źródło
1
Jak możemy utworzyć tę samą tablicę za pomocą instrukcji pętli?
Anoop Pete
@ Anoop-Pete W drugim fragmencie dwa powtarzające się bloki zostaną umieszczone w pętli, a indeks numeryczny zostanie zastąpiony zmienną, która jest zwiększana w każdej iteracji.
Atli
1
@AnoopPete: for ($ i = 0; $ i <count ($ tablica); $ i ++) {print ($ tablica [$ i] ['nazwa']); }
Dax
64

Poniższe są równoważne i dają w wyniku dwuwymiarową tablicę:

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

lub

$array = array();

$array[] = array(0, 1, 2);
$array[] = array(3, 4, 5);
David Snabel-Caunt
źródło
7
Nie powodują one dwuwymiarowych tablic, ale raczej tablicę tablic.
dotancohen
5
@dotancohen To tak naprawdę tylko semantyka. Praktycznie te dwie koncepcje są takie same. Jedyną różnicą między tym, co jest tam przedstawione, a rodzajem wielowymiarowych tablic używanych w językach takich jak C # jest składnia. I do tego dość mała różnica w składni.
Atli
1
Przynajmniej w C # wymagania dotyczące pamięci są różne. Tablica tablic przydziela tylko ilość pamięci potrzebną dla każdej tablicy. Dwuwymiarowa tablica przydziela całe N * M pamięci.
dotancohen,
6
@dotancohen Wymagania pamięci między PHP i C # są ogólnie bardzo różne, ponieważ środowisko wykonawcze każdego języka ma swój własny sposób obsługi pamięci. Na ogół nie jest to coś, czym się martwisz w praktyce. Nie, chyba że tworzysz jakąś długotrwałą, wydajną aplikację, taką jak gra, w którym to przypadku PHP byłby dziwnym wyborem języka.
Atli,
41

Po prostu zadeklaruj? Nie musisz. Tylko upewnij się, że zmienna istnieje:

$d = array();

Tablice są zmieniane dynamicznie, a próba zapisania czegokolwiek w nieistniejącym elemencie tworzy to (i tworzy całą tablicę w razie potrzeby)

$d[1][2] = 3;

Dotyczy to dowolnej liczby wymiarów bez wcześniejszej deklaracji.

Kornel
źródło
3
Tyle że to nic nie mówi o wymiarach. Jeśli deklarujesz tablicę M x N 2D, jest szansa, że ​​jest to macierz, a jeśli jest to macierz, są szanse, że będziesz wykonywać mnożenie lub coś na nim, co będzie wymagało iteracji po elementach, czego nie możesz zrobić, jeśli jest „rzadkie” i nie znam wymiarów.
cletus
@cletus: możesz po prostu użyć countodpowiedniego wymiaru, np. count($d[1])chyba, że ​​źle rozumiem twój punkt widzenia?
DisgruntledGoat
2
Mimo to PHP nie ma tablic wielowymiarowych. Zawsze pojawi się możliwość, że tablica tablic może być rzadka. A więc co powiesz na stworzenie klasy, która implementuje macierz przy użyciu tablic, przynajmniej wtedy zadbałbyś o właściwą implementację.
Don
27

Po pierwsze, PHP nie ma tablic wielowymiarowych, ma tablice tablic.

Po drugie, możesz napisać funkcję, która to zrobi:

function declare($m, $n, $value = 0) {
  return array_fill(0, $m, array_fill(0, $n, $value));
}
cletus
źródło
2
Nie masz na myśli „tablice z tablicami”, zamiast „tablic lub tablice”?
Asaph
@ Asaph: tak, zrobiłem. Naprawiony. Dzięki.
cletus
1
Ustawienie tablicy zer jest zadaniem całkowicie bezcelowym. Nie musisz deklarować tablicy, po prostu jej użyj.
DisgruntledGoat
8
Z wyjątkiem sytuacji, gdy musisz powtórzyć to lub określić jego rozmiar, tak jak w przypadku mnożenia macierzy. Istnieje doskonale uzasadniony przypadek wypełniania wartości tablicy.
cletus
11

Aby uzyskać proste rozwiązanie typu „wypełniaj na bieżąco”:

$foo = array(array());

To da ci elastyczną pseudo dwuwymiarową tablicę, która może pomieścić $ foo [ n ] [ n ], gdzie n <= ∞ (oczywiście jesteś ograniczony zwykłymi ograniczeniami rozmiaru pamięci, ale mam nadzieję, że masz pomysł). Teoretycznie można to rozszerzyć, aby utworzyć tyle pod tablic, ile potrzebujesz.

Kingsolmn
źródło
9

Lub w przypadku większych tablic, wszystkie o tej samej wartości:

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

utworzy tablicę $mby $nze wszystkim ustawionym na $value.

Bursztyn
źródło
3

O ile wiem, nie ma wbudowanej funkcji php, aby to zrobić, musisz to zrobić za pomocą pętli lub niestandardowej metody, która rekurencyjnie wywołuje coś takiego jak array_fill inidcated w odpowiedzi przez @Amber;

Zakładam, że masz na myśli stworzenie pustej, ale zintializowanej tablicy tablic. Na przykład chcesz uzyskać końcowe wyniki, takie jak poniżej, dla tablicy 3 tablic :

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

Jest to proste do ręcznego wykonania kodu, ale dla tablicy o dowolnym rozmiarze, takiej jak tablica 3 tablic po 3 tablice , inicjalizacja przed użyciem zaczyna być skomplikowana:

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

...itp...

Czuję frustrację. Byłoby miło mieć łatwy sposób na zadeklarowanie zainicjowanej tablicy tablic o dowolnej głębokości bez sprawdzania lub zgłaszania błędów.

Promień
źródło
3

Odpowiedź atli naprawdę pomogła mi to zrozumieć. Oto przykład iteracji po dwuwymiarowej tablicy. Ten przykład pokazuje, jak znaleźć wartości dla znanych nazw tablicy, a także foreach, gdzie po prostu przejdziesz przez wszystkie pola, które tam znajdziesz. Mam nadzieję, że to komuś pomoże.

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

Wyjścia:

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
źródło
2

A dla mnie argument o tym, czy tablica powinna być rzadka, czy nie, zależy od kontekstu.

Na przykład, jeśli $ a [6] [9] nie jest wypełnione, jest odpowiednikiem wypełnienia $ a [6] [9], na przykład przez „” lub 0.

user824232
źródło
2
$r = array("arr1","arr2");

aby wyświetlić pojedynczy element tablicy, należy napisać:

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

wynik będzie następujący: arr1 arr2

Deshal Kh
źródło
2
To jest tablica jednowymiarowa. Tablica wielowymiarowa ma co najmniej tablicę w tablicy.
Mike Stratton,
2

I podoba mi się ten sposób:

$cars = array
  (
  array("Volvo",22),
  array("BMW",15),
  array("Saab",5),
  array("Land Rover",17)
  );
Oskar
źródło
0

Jeśli chcesz szybko utworzyć wielowymiarową tablicę dla prostej wartości za pomocą jednego linera, polecam skorzystanie z tej biblioteki tablic, aby zrobić to w następujący sposób:

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

które wyprodukują

[
  1 => [
    2 => [
      3 => 'value'
    ]
  ]
]
Minwork
źródło
0

Możesz spróbować, ale wartości drugiego wymiaru będą równe indeksom:

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

trochę bardziej skomplikowane dla pustej tablicy:

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

Denis Ivanov
źródło
0

Musisz zadeklarować tablicę w innej tablicy.

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

Przykład:

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

Aby uzyskać pierwszy element z tablicy, użyjesz $arr[0][0], to jest jak pierwszy element z pierwszej tablicy z tablicy. $arr[1][0]zwróci pierwszy element z drugiej tablicy z tablicy.

mmateas
źródło