Aktueller Standort: Startseite> Neueste Artikel> Häufige Fehler beim Erstellen von 2D -Arrays mit Array_Fill ()

Häufige Fehler beim Erstellen von 2D -Arrays mit Array_Fill ()

M66 2025-06-05

In PHP ist Array_Fill () eine sehr bequeme Funktion, um ein Array mit angegebenen Werten zu füllen. Es wird normalerweise verwendet, um Arrays zu initialisieren, insbesondere wenn wir schnell ein Array von Standardwerten generieren müssen. Viele Entwickler neigen jedoch dazu, bei Verwendung von Array_Fill () in gemeinsame Missverständnisse zu geraten, um zweidimensionale Arrays zu erstellen, was zu einem unerwarteten Verhalten im Programm führt. In diesem Artikel werden diese häufigen Fehler untersucht und wie man sie korrekt vermeidet.

1. Grundnutzung von Array_Fill ()

Bevor Sie sich mit der Frage befassen, überprüfen wir kurz die grundlegende Verwendung von Array_Fill () :

 $filledArray = array_fill(0, 5, 'default');
// Ergebnis: ['default', 'default', 'default', 'default', 'default']

Diese Funktion akzeptiert drei Parameter:

  1. Starten Sie den Index (aus welchem ​​Index mit der Füllung beginnen)

  2. Arraylänge (gefüllt mit mehreren Elementen)

  3. Wert füllen

2. Häufige Fehler: Bezieht sich auf dieselbe Array -Instanz

Wenn wir versuchen, Array_Fill () zu verwenden, um ein zweidimensionales Array zu erstellen, z. B. 5 Zeilen mit jeweils 3 Standardwerten "Standard" , schreiben viele Entwickler den folgenden Code:

 $matrix = array_fill(0, 5, array_fill(0, 3, 'default'));

Auf den ersten Blick erscheint diese Art des Schreibens vernünftig. Das Ausgangsergebnis ist ebenfalls wie erwartet:

 [
    ['default', 'default', 'default'],
    ['default', 'default', 'default'],
    ['default', 'default', 'default'],
    ['default', 'default', 'default'],
    ['default', 'default', 'default']
]

Aber das Problem ist: Diese Subtarrays sind tatsächlich Verweise auf dasselbe Array !

Das heißt, wenn wir den Wert eines der Subtarrays ändern:

 $matrix[0][0] = 'changed';

Dies führt dazu, dass der erste Wert aller Zeilen "verändert" wird:

 [
    ['changed', 'default', 'default'],
    ['changed', 'default', 'default'],
    ['changed', 'default', 'default'],
    ['changed', 'default', 'default'],
    ['changed', 'default', 'default']
]

Dies liegt daran, dass Array_Fill () mit Verweise auf dasselbe Array gefüllt ist, wenn der dritte Parameter ein Array ist, anstatt jeweils eine neue Array -Instanz zu erstellen.

3. Richtiger Weg: Verwenden Sie Schleifen, um ein einzigartiges Subtarray zu konstruieren

Um dieses Problem zu lösen, müssen wir sicherstellen, dass jedes Subtarray eine unabhängige Instanz ist. Der sicherste Weg, dies zu tun, besteht darin, eine Schleife zu verwenden:

 $matrix = [];
for ($i = 0; $i < 5; $i++) {
    $matrix[$i] = array_fill(0, 3, 'default');
}

Dies stellt sicher, dass das Array jeder Zeile eine neue Kopie ist und sich nicht gegenseitig beeinflusst.

4. Seien Sie vorsichtig, um gemeinsame Referenzen in der Funktionskapulation zu vermeiden

Wenn Sie eine Funktion zusammenfassen, die ein zweidimensionales Array erstellt, achten Sie darauf, dass sie nicht außerhalb der Funktion Subarrays erstellen, und verwenden Sie es dann wieder. Zum Beispiel:

Fehlerdemonstration:

 function createMatrix($rows, $cols, $defaultValue) {
    $rowTemplate = array_fill(0, $cols, $defaultValue);
    return array_fill(0, $rows, $rowTemplate);
}

Dieses Problem ist das gleiche wie oben beschrieben. Alle Zeilen beziehen sich auf die gleiche $ rowTemplate . Das Ändern einer Linie wirkt sich auf alle Zeilen aus.

Richtiges Schreiben:

 function createMatrix($rows, $cols, $defaultValue) {
    $matrix = [];
    for ($i = 0; $i < $rows; $i++) {
        $matrix[] = array_fill(0, $cols, $defaultValue);
    }
    return $matrix;
}

5. Ein Beispiel in realen Anwendungen

Nehmen wir an, Sie erstellen ein Online-Tool zur Erzeugung von Fragen (z . B. https://m66.net/tools/quiz-generator ).

 $questionBoard = [];
for ($i = 0; $i < 10; $i++) {
    $questionBoard[] = array_fill(0, 5, null);
}

Dieser Ansatz kann es vermeiden, den Speicher auf die gesamte Frageplatine versehentlich zu teilen und Fehler in der Benutzerinteraktion oder der nachfolgenden Logik zu verursachen.

6. Schlussfolgerung

Array_Fill () ist ein effizientes Werkzeug, aber wenn es um verschachtelte Arrays (zweidimensional oder mehrdimensional) geht, müssen wir uns vor gemeinsamen Referenzen vorsichtig machen. Durch die Verwendung von Schleifen und der Sicherstellung, dass jedes Subtarray eine neue Instanz ist, können wir robustere und vorhersehbare Datenstrukturen erstellen.

Das Verständnis des Wert- und Referenzmechanismus in PHP hilft nicht nur, dieses Problem zu vermeiden, sondern verbessert auch Ihre Fähigkeit, mit komplexen Array -Strukturen in großen Projekten umzugehen.