PHP Handling mehrdimensionaler Arrays

norbert_pdm

Cadet 2nd Year
Registriert
März 2021
Beiträge
25
Hallo, hallo allerseits,

ich bastel gerade an einer etwas komplexeren Abfrage einer Datenbank rum und bin dabei über mehrdimensionalle Arrays 'gestolpert'...
Vielleicht könnt ihr mir ja helfen... ;-)
Ich hole für einen Mitarbeiter aus der Datenbank zu jedem seiner Fälle bestimmte Informationen. Das klappt soweit auch super. Vereinfacht sieht es so aus:
PHP:
$arrayname[0][0] = Fall_ID_1;
$arrayname[0][1] = Fallname_1;
$arrayname[1][0] = Fall_ID_2;
$arrayname[1][1] = Fallname_2;
$arrayname[2][0] = Fall_ID_3;
$arrayname[2][1] = Fallname_3;
usw.
(Mal nebenbei: wie kann man ein mehrdimensionalles Array initialisieren? Eindimensionla ist ja recht einfach:
PHP:
$arrayname = [];
geht simpel, aber
PHP:
$arrayname = [][];
geht ja nicht... :mad:)

Nun will ich das obige Konstrukt auf alle Mitarbeiter anwenden... Lasse da also ne Schleife drüber... Und.. ? Die Einträge mit einem niedrigem Index werden korrekt überschrieben. Aber wenn ein neuer MA weniger Fälle hat, als der MA davor, werden die 'oberen' Einträge (also bei mir zB
PHP:
$arrayname[2][0] = Fall_ID_3;
$arrayname[2][1] = Fallname_3;
) natürlich nicht überschrieben...

Soooo... jetzt meine eigentliche Frage ;-)
Wie kann man das Array sinnvollerweise zurücksetzen?
Wenn ich mit
PHP:
unset($arrayname);
das Array zurück setze, dann bemängelt er beim nächsten Schleifendurchlauf, dass das Array nicht initialisiert ist.

Und
PHP:
$arrayname = array();
geht auch nicht, da es ja mehrdimesional ist.

Alle Lösungen, die ich im Netz gefunden erscheinen mir viel zu kompliziert.
Kennt jemand von euch eine einfachere Lösung?
Das wäre ganz wunderbar :-)

Viele Grüße,
Norbert
 
bei php bin ich raus, aber vllt klappt das ja?
$arrayname[] = array(''=>,''=>);
 
norbert_pdm schrieb:
wie kann man ein mehrdimensionales Array initialisieren?
Übersetzt bedeutet das ja nichts anderes als ein Array von Arrays. Also ein Array, dessen Werte wiederum selbst Arrays sind. Die Syntax $arr[0][0] ist der Zugriff auf das jeweils erste Element des äußeren und inneren Arrays.
Und wir sprechen hier schon wirklich von PHP? Dem ist es doch vollkommen egal, was du in ein Array an Datentypen reinsteckst, du kannst das sogar mischen. Initialisieren brauchst du hier nichts. Dementsprechend kannst du dein voriges Array komplett z.B. mit $arr = []; leeren, oder stellenweise mit $arr[3] = [];.
 
Okay, zunächst: Das ist wirklich kein guter Programmier-Stil und so programmiert man in PHP seit 10 Jahren nicht mehr. Korrekterweise solltest du einfach eine Klasse Employee machen und eine Klasse Case und dann kann ein Objekt vom Typ Employee mehrere Objekte vom Typ Case halten. Dann kannst du für jeden Datenbankzeile ein neues Case-Objekt erstellen und dann seitens des Employee eine addCase()-Methode schreiben die einfach ein Case-Objekt als Parameter nimmt und das dann dort intern vom ein Array oder einer Liste von Cases hat.

Da ich aber weiß wie das ist, wenn irgendwelche Schlaumeier wie ich einem im Internet mit so Bullshit zutexten und du nur deinen Weg hören möchtest:

Du kannst array() ineinander schachteln, das willst du wohl einfach machen in deinem Fall (nur halt in einem Loop):

Code:
$someArrayName= array(
  array(123, "this"),
  array(456, "sucks")
);

In einem Loop wäre es dann irgendwie so, hier halt mit foreach um deinen Datenbank-Loop zu simulieren (am Ende kommt es darauf an wie die Daten vorliegen):

Code:
$someArrayName = array();
foreach($employees as $employeeId => $employee) {
    $someArrayName[$employeeId] = array();
    foreach($cases as $caseId => $case) {
        $someArrayName[$employeeId][$caseId] = $case;
    }
}

Nicht getestet, kann Tippfehler enthalten.

Trotzdem würde ich wirklich davon abraten wenn du das für irgendeinen professionellen Kontext so programmierst. Sowas ufert auf lange Sicht immer aus, ist schwer lesbar und der Grundstein für technical debt.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Nase
norbert_pdm schrieb:
Mal nebenbei: wie kann man ein mehrdimensionalles Array initialisieren? Eindimensionla ist ja recht einfach
Zunächst einmal muss man Arrays in PHP überhaupt nicht initialisieren. Die Standard-Arrays der Sprache sind ja eigentlich keine klassisches Arrays mit festen Dimensionen, sondern werden wie alle Variablen einfach benutzt, und sie wachsen dann dynamisch. Und dann initialisierst du mit
PHP:
$a = [];
ein leeres Array, also hat es auch die erste Dimension eigentlich noch gar nicht. Das ist also auch für mehrdimensionale Arrays der gleiche Vorgang. Falls du unbedingt vorab sagen wolltest, dass ein Eintrag in einem Array erneut ein noch leeres Array sein soll, dann geht das so:
PHP:
$a = [];
foreach (array_keys($a) as $key) {
    $a[$key] = [];
}
Wie du siehst, passiert dabei gar nichts, weil $a noch leer ist. Also kannst du es dir auch sparen.

In der Praxis muss man Arrays in PHP nur sicherheitshalber vordefinieren. Eigentlich belegt man sie einfach mit Daten. Nur für den Fall, dass zum Beispiel das Befüllen in einem if() steht und womöglich nicht passieren könnte, packt man vor das if() die Vorabdefinition mit dem leeren Array.

ultio schrieb:
Du kannst array() ineinander schachteln, das willst du wohl einfach machen in deinem Fall (nur halt in einem Loop):

Code:
$someArrayName= array(
array(123, "this"),
array(456, "sucks")
);
Das Konstrukt array() benötigt man nicht mehr. Die Schreibweise mit den eckigen Klammern funktioniert inzwischen durchgehend:
PHP:
$someArrayName= [
    [123, "this"],
    [456, "sucks"],
];

Nase schrieb:
Dementsprechend kannst du dein voriges Array komplett z.B. mit $arr = []; leeren, oder stellenweise mit $arr[3] = [];.
Wobei das den Array-Key 3 weiterhin als leeres Array erhält. Soll der Eintrag komplett aus dem Array entfernt werden, dann nimmt man
PHP:
unset($a[3]);

@norbert_pdm Ein weiterer Tipp zu jeder Art von beliebig geschachtelten Variablen. Wenn man mit eventuell nicht existierenden Unterbereichen in den Daten arbeitet, kann man das immer mit nur einem isset() erledigen. Man braucht also nur ein einzelnes
PHP:
if (isset($a[2][3]['name'])) { /* ... */ }
unabhängig davon, ob $a[2] überhaupt existiert.
Ergänzung ()

So, das wurde im Editor arg lang. Nun zu
norbert_pdm schrieb:
Vereinfacht sieht es so aus:
PHP:
$arrayname[0][0] = Fall_ID_1;
$arrayname[0][1] = Fallname_1;
$arrayname[1][0] = Fall_ID_2;
$arrayname[1][1] = Fallname_2;
$arrayname[2][0] = Fall_ID_3;
$arrayname[2][1] = Fallname_3;
Wieso sind die Fall-IDs nicht die Keys für die Unter-Arrays? Genau dafür wären sie eigentlich da. Also in dem Beispiel 1:1 erstmal so:
PHP:
$arrayname[Fall_ID_1][1] = Fallname_1;
$arrayname[Fall_ID_2][1] = Fallname_2;
$arrayname[Fall_ID_3][1] = Fallname_3;
Die sinnvollere Organisation dieser Daten wäre allerdings so, dass man dann die Daten der einzelnen Fälle auch mit sprechenden Unterschlüsseln ablegt:
PHP:
$arrayname = [
    [Fall_ID_1] => [
        'name' => 'Fallname_1',
        // mehr zum 1. Fall
    ],
    [Fall_ID_2] => [
        'name' => 'Fallname_2',
        // mehr zum 2. Fall
    ],
    [Fall_ID_3] => [
        'name' => 'Fallname_3',
        // mehr zum 3. Fall
    ],
];
Da behält man dann im weiteren Verlauf viel besser die Übersicht, was wo steht.
Ergänzung ()

norbert_pdm schrieb:
Aber wenn ein neuer MA weniger Fälle hat, als der MA davor, werden die 'oberen' Einträge [...] natürlich nicht überschrieben...
Das ist nun wieder kompletter Unfug. Man schreibt in dem existierenden Array in dem Fall nicht rum, sondert überschreibt es komplett.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: kim88
Hallo, hallo allerseits,

erst mal Danke für die zahlreichen Antworten.
Einiges davon wusste ich schon und es war nicht ganz das, was ich gefragt hatte, einiges trug noch einmal zur 'Erhellung' bei...
In meinem Fall geht es darum, dass ich die Arrays eben nicht als assoziative Arrays aufbauen will, weil das Durchlaufen des Arrays nicht mit einem foreach möglich ist, sondern über eine Zählschleife realisiert werden muss.

Nixdorf schrieb:
Wieso sind die Fall-IDs nicht die Keys für die Unter-Arrays? Genau dafür wären sie eigentlich da. Also in dem Beispiel 1:1 erstmal so:
PHP:
$arrayname[Fall_ID_1][1] = Fallname_1;
$arrayname[Fall_ID_2][1] = Fallname_2;
$arrayname[Fall_ID_3][1] = Fallname_3;
Die sinnvollere Organisation dieser Daten wäre allerdings so, dass man dann die Daten der einzelnen Fälle auch mit sprechenden Unterschlüsseln ablegt:
PHP:
$arrayname = [
[Fall_ID_1] => [
'name' => 'Fallname_1',
// mehr zum 1. Fall
],
[Fall_ID_2] => [
'name' => 'Fallname_2',
// mehr zum 2. Fall
],
[Fall_ID_3] => [
'name' => 'Fallname_3',
// mehr zum 3. Fall
],
];
Da behält man dann im weiteren Verlauf viel besser die Übersicht, was wo steht.

Wahrscheinlich ist mein gesamtes Konstrukt eher sehr kompliziert (oder eben veraltet ;-) ), aber ich sprech die einzelnen Elemente eben über Indizes an. Wie gesagt, das liegt daran, dass ich das Array aus verschiedenen Bereichen der Datenbank hole und sie dann 'zeilenweise' durchlaufe.

Nixdorf schrieb:
Das ist nun wieder kompletter Unfug. Man schreibt in dem existierenden Array in dem Fall nicht rum, sondert überschreibt es komplett.
Letztlich ist genau das die alles entscheidende Frage... ;-)
Wie kann ich genau dieses tun ... ? Also komplett überschreiben?
 
norbert_pdm schrieb:
weil das Durchlaufen des Arrays nicht mit einem foreach möglich ist, sondern über eine Zählschleife realisiert werden muss
Wieso? Das riecht nach schlecht gewordenem Code.

Ich tippe mal, dass es für jede Begründung ein starkes Argument dagegen gibt. Insbesondere befürchte ich, dass hier gerade beim Erstellen von schlecht wartbarem und ineffizientem Code geholfen wird.

norbert_pdm schrieb:
aber ich sprech die einzelnen Elemente eben über Indizes an.
Und wo kommen die her? Wieso selber Indizes bauen, die in den Daten in Form von Fall-IDs vorhanden sind?

norbert_pdm schrieb:
Wie kann ich genau dieses tun ... ? Also komplett überschreiben?
Hast du selber geschrieben, mit $arrayname = [];. Schon ist es leer. Oder halt einfach das gesamte Array einfach überschreiben, mit $arrayname = ...;.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: breedmaster und RalphS
Zurück
Oben