Wie deklariere ich ein zweidimensionales Array?

91

Was ist der einfachste Weg, um ein 2D-Array zu erstellen? Ich hatte gehofft, etwas Ähnliches tun zu können:

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

Antworten:

81

Sie können auch ein assoziatives Array oder ein "Hash-Table" -ähnliches Array erstellen, indem Sie den Index des Arrays angeben.

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

Welches ist gleichbedeutend mit

$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
quelle
1
Wie können wir dasselbe Array mithilfe von Schleifenanweisungen erstellen?
Anoop Pete
@ Anoop-Pete Im zweiten Snippet werden die beiden sich wiederholenden Blöcke in die Schleife eingefügt und der numerische Index durch eine Variable ersetzt, die bei jeder Iteration inkrementiert wird.
Atli
1
@AnoopPete: for ($ i = 0; $ i <count ($ array); $ i ++) {print ($ array [$ i] ['name']); }
Dax
64

Die folgenden sind äquivalent und führen zu einem zweidimensionalen Array:

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

oder

$array = array();

$array[] = array(0, 1, 2);
$array[] = array(3, 4, 5);
David Snabel-Caunt
quelle
7
Diese führen nicht zu zweidimensionalen Arrays, sondern zu einem Array von Arrays.
Dotancohen
5
@dotancohen Das ist wirklich nur Semantik. Praktisch sind die beiden Konzepte gleich. Der einzige Unterschied zwischen dem, was dort gezeigt wird, und der Art der mehrdimensionalen Arrays, die in Sprachen wie C # verwendet werden, ist die Syntax. Und ein ziemlich kleiner Unterschied in der Syntax.
Atli
1
Zumindest in C # sind die Speicheranforderungen unterschiedlich. Ein Array von Arrays weist nur die für jedes Array benötigte Speichermenge zu. Ein zweidimensionales Array ordnet das gesamte N * M des Speichers zu.
Dotancohen
6
@dotancohen Die Speicheranforderungen zwischen PHP und C # sind im Allgemeinen sehr unterschiedlich, da die Laufzeit jeder Sprache ihre eigene Art des Speicherhandhabens hat. In der Praxis geht es Ihnen im Allgemeinen nicht darum. Nicht, wenn Sie nicht gerade eine lang laufende Hochleistungs-App wie ein Spiel erstellen. In diesem Fall wäre PHP eine seltsame Wahl für eine Sprache.
Atli
40

Einfach deklarieren? Das musst du nicht. Stellen Sie einfach sicher, dass eine Variable vorhanden ist:

$d = array();

Die Größe von Arrays wird dynamisch geändert, und der Versuch, etwas in ein nicht vorhandenes Element zu schreiben, erstellt es (und erstellt bei Bedarf das gesamte Array).

$d[1][2] = 3;

Dies gilt für eine beliebige Anzahl von Dimensionen ohne vorherige Erklärung.

Kornel
quelle
3
Nur dass das nichts über die Abmessungen aussagt. Wenn Sie ein M x N 2D-Array deklarieren, ist es wahrscheinlich eine Matrix, und wenn es sich um eine Matrix handelt, führen Sie wahrscheinlich eine Multiplikation durch oder etwas, das eine Iteration über die Elemente erforderlich macht, was Sie nicht tun können, wenn dies der Fall ist "spärlich" und kenne die Dimensionen nicht.
Cletus
@cletus: Sie können jedoch nur countdie richtige Dimension verwenden, z. B. es count($d[1])sei denn, ich verstehe Ihren Standpunkt falsch?
DisgruntledGoat
2
PHP verfügt jedoch nicht über mehrdimensionale Arrays. Es besteht immer die Möglichkeit, dass ein Array von Arrays spärlich ist. Wie wäre es also mit einer Klasse, die eine Matrix mithilfe von Arrays implementiert? Zumindest würden Sie sich dann mehr um die ordnungsgemäße Implementierung kümmern.
Don
26

Erstens hat PHP keine mehrdimensionalen Arrays, sondern Arrays von Arrays.

Zweitens können Sie eine Funktion schreiben, die dies erledigt:

function declare($m, $n, $value = 0) {
  return array_fill(0, $m, array_fill(0, $n, $value));
}
Cletus
quelle
2
Meinen Sie nicht "Arrays von Arrays" anstelle von "Arrays oder Arrays"?
Asaph
@Asaph: Ja, das habe ich getan. Fest. Vielen Dank.
Cletus
1
Das Einrichten eines Arrays von Nullen ist eine völlig sinnlose Übung. Sie müssen kein Array deklarieren, sondern nur verwenden.
DisgruntledGoat
7
Außer wenn Sie darüber iterieren oder die Größe bestimmen müssen, wie wenn Sie sagen, dass Sie eine Matrixmultiplikation durchführen. Es gibt einen durchaus gültigen Fall für das Füllen der Array-Werte.
Cletus
11

Für eine einfache "Fill as you go" -Lösung:

$foo = array(array());

Dadurch erhalten Sie ein flexibles zweidimensionales Pseudo-Array, das $ foo [ n ] [ n ] mit n <= ∞ enthalten kann (natürlich sind Sie durch die üblichen Einschränkungen der Speichergröße begrenzt, aber ich hoffe, Sie haben die Idee). Dies könnte theoretisch erweitert werden, um so viele Sub-Arrays zu erstellen, wie Sie benötigen.

Kingsolmn
quelle
9

Oder für größere Arrays mit demselben Wert:

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

erstellt ein $mby- $nArray, auf das alles eingestellt ist $value.

Bernstein
quelle
3

Soweit mir bekannt ist, gibt es dafür keine eingebaute PHP-Funktion. Sie müssen dies über eine Schleife oder über eine benutzerdefinierte Methode tun, die rekursiv etwas wie array_fill aufruft, das in der Antwort von @Amber angegeben ist.

Ich gehe davon aus, dass Sie damit ein leeres, aber initialisiertes Array von Arrays erstellt haben. Zum Beispiel möchten Sie ein Endergebnis wie das folgende eines Arrays von 3 Arrays :

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

Dies ist einfach, nur von Hand zu codieren, aber für ein Array beliebiger Größe wie ein Array mit 3 Arrays mit 3 Arrays wird die Initialisierung vor der Verwendung immer komplexer:

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

...etc...

Ich bekomme die Frustration. Es wäre schön, eine einfache Möglichkeit zu haben, ein initialisiertes Array von Arrays mit beliebiger Tiefe zu deklarieren, ohne Fehler zu überprüfen oder auszulösen.

Strahl
quelle
3

Die Antwort von atli hat mir wirklich geholfen, das zu verstehen. Hier ist ein Beispiel für das Durchlaufen eines zweidimensionalen Arrays. Dieses Beispiel zeigt, wie Sie Werte für bekannte Namen eines Arrays und einen Foreach finden, in dem Sie einfach alle dort gefundenen Felder durchgehen. Ich hoffe es hilft jemandem.

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

Ausgänge:

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
James Burnett
quelle
2

Und für mich hängt das Argument, ob ein Array spärlich sein soll oder nicht, vom Kontext ab.

Wenn beispielsweise $ a [6] [9] nicht ausgefüllt ist, entspricht dies $ a [6] [9], das beispielsweise mit "" oder 0 gefüllt ist.

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

Um ein einzelnes Array-Element wiederzugeben, sollten Sie Folgendes schreiben:

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

Ausgabe wäre: arr1 arr2

Deshal Kh
quelle
2
Dies ist ein eindimensionales Array. Ein mehrdimensionales Array hat mindestens ein Array innerhalb eines Arrays.
Mike Stratton
2

Und ich mag diesen Weg:

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

Wenn Sie schnell ein mehrdimensionales Array für einen einfachen Wert mit einem Liner erstellen möchten, würde ich empfehlen, diese Array-Bibliothek folgendermaßen zu verwenden:

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

was produzieren wird

[
  1 => [
    2 => [
      3 => 'value'
    ]
  ]
]
Minwork
quelle
0

Sie können dies versuchen, aber die Werte der zweiten Dimension entsprechen den Indizes:

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

etwas komplizierter für leeres Array:

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

Denis Ivanov
quelle
0

Sie müssen ein Array in einem anderen Array deklarieren.

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

Beispiel:

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

Um das erste Element aus dem Array abzurufen, verwenden Sie Folgendes $arr[0][0]: Dies entspricht dem ersten Element aus dem ersten Array aus dem Array. $arr[1][0]gibt das erste Element aus dem zweiten Array aus dem Array zurück.

mmateas
quelle