PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Array abfragen


Marilu
06.12.2005, 16:10:30
Moin,

diesmal hab ichs mit Arrays. Ich übergebe per GET: "0342". Jetzt möchte ich, nachdem ich den String zerlegt habe, auf das Arrayelement
$aArray[0][3][4][2] zugreifen (lesend und schreibend). Ich bekomme z. B. 'aArray[0][3][4][2]' problemlos in eine Variable $arr, aber komme nicht an das Arrayelement (auch nicht mit $$arr). Habe ich hier einen groben Denkfehler?

P.S.: Anstatt "0342" könnte es auch "3" oder "51" oder "234" heißen ...

Damir
07.12.2005, 08:44:09
Hi,

kannst du mal ein wenig mehr erzaehlen - den Hintergrund von diesem Aufbau und woher die Daten kommen, di in den Arrays dann stehen.....

Damir

Marilu
07.12.2005, 09:49:52
Moin Damir,

> kannst du mal ein wenig mehr erzaehlen - den Hintergrund von diesem Aufbau und woher die Daten kommen, di in den Arrays dann stehen.....

Es handelt sich um eine Menüsteuerung über geschachtelte Arrays. Ich kann das Problem aber herunterbrechen:

Ich habe ein Array $arr = array("1", "2", "3"); . Wenn ich eine Variable $var = 1 habe, möchte ich über $var1 = "arr[$var]" auf das Arrayelement zugreifen; $arr[$var] geht nicht, da $var unterschiedlich lang sein kann.

meikel (†)
07.12.2005, 12:24:35
Es handelt sich um eine Menüsteuerung über geschachtelte Arrays.
Sowas löst man mittels Rekursion.

Ich habe ein Array $arr = array("1", "2", "3"); . Wenn ich eine Variable $var = 1 habe, möchte ich über $var1 = "arr[$var]" auf das Arrayelement zugreifen; $arr[$var] geht nicht, da $var unterschiedlich lang sein kann.
Der Sinn dieses Denkansatzes verschließt sich mir.

Mein Menübaum sieht prinzipiell so aus:
$_menu = array (
0 => array ('title' => 'Home',
'par' => 'home',
'mode' => 'home',
'rights'=> array(),
'sub' => false),

1 => array ('title' => 'service',
'par' => '1',
'mode' => 'service',
'rights'=> array('user','admin'),
'sub' => false),

2 => array ('title' => 'webspace',
'par' => '2',
'mode' => 'webspace',
'rights'=> array('user','admin'),
'sub' => array(
0 => array('title' => 'Standard',
'par' => '2,1',
'mode' => 'standard',
'rights'=> array('user','admin'),
'sub' => false),
1 => array('title' => 'Premium',
'par' => '2,2',
'mode' => 'premium',
'rights'=> array('user','admin'),
'sub' => false)
)
)
);
Und dort wird mittels foreach() rekursiv "durchgelatscht". Die Knotenpunkte im QUERY String werden durch Kommas getrennt.

Marilu
07.12.2005, 13:08:41
> Sowas löst man mittels Rekursion.

Das ist ja gerade das Problem. Mein Array $menu wird rekursiv durchlaufen. Die Funktion, die das macht, muß die aktuelle "Position" im Array zurückmelden, damit ich Untermenüs auf- und zuklappen kann.

> Der Sinn dieses Denkansatzes verschließt sich mir.

Das muß ich bei Deinem Beispiel - leider - auch sagen, ohne mehr Quellcode gesehen zu haben ... :-)))
Vielleicht könntest Du mir zeigen, wie Du das Array dann verarbeitest, z. B. wie Du Submenüs anzeigen und verbergen kannst.

Thx, Marilu

meikel (†)
07.12.2005, 13:34:43
@Marilu
>> Der Sinn dieses Denkansatzes verschließt sich mir.

>Das muß ich bei Deinem Beispiel - leider - auch sagen, ohne mehr Quellcode gesehen zu haben ... :-)))

Schade. Der Quelltext erklärt sich eigentlich aus der Arraystruktur.

>Vielleicht könntest Du mir zeigen, wie Du das Array dann verarbeitest, z. B. wie Du Submenüs anzeigen und verbergen kannst.

Auszugsweise aus der Methode buildMenu():

if (count($menu[$i]['rights']) > 0 AND
! in_array($this->RIGHTS,$menu[$i]['rights'])) continue; # User hat keine Berechtigung
# ...


if (!is_array($menu[$i][SUB])) continue;
$par1 = explode(',', $_GET[MENU]);
$par2 = explode(',', $menu[$i][PAR]);
if ($par1[$level] != $par2[$level]) continue; # nicht der richtige Knotenpunkt
$ret .= $this->buildMenu($menu[$i][SUB], $level+1);# Einstieg in die Rekursion

Marilu
07.12.2005, 14:29:35
Sorry, aber auch mit dieser Erläuterung kann ich es nicht so ganz nachvollziehen.

Aber das ändert nichts an meinem Problem, ein Arrayelement auszulesen, wenn ich nur die Indizes des Elements habe.

meikel (†)
07.12.2005, 14:35:20
Sorry, aber auch mit dieser Erläuterung kann ich es nicht so ganz nachvollziehen.
Geht mir genauso, denn das verstehe ich nun wieder nicht:
Aber das ändert nichts an meinem Problem, ein Arrayelement auszulesen, wenn ich nur die Indizes des Elements habe.
Versuchen wirs mal auf der Basis einer stinknormalen Textaufgabe
Gegeben: _____
Gesucht: _____
einzuhaltende Regeln: _____

Marilu
07.12.2005, 14:43:35
OK, ich versuchs mal:

Gegeben: $index = "032".
Gesucht: Inhalt von $arr[0][3][2].
einzuhaltende Regeln: Ich kann das Array nicht über z. B. $arr[$a][$b][$c] abfragen, da $index unterschiedlich lang sein kann. Ich suche also eine Möglichkeit, so was wie:

$var = "arr[0][3][2]";
$inhalt = $$var;

zu realisieren.

meikel (†)
07.12.2005, 15:45:05
OK, ich versuchs mal:

Gegeben: $index = "032".
Gesucht: Inhalt von $arr[0][3][2].
In og. Array
Ich habe ein Array $arr = array("1", "2", "3"); .
gibt es nur EINE Dimension!

Nehmen wir mal an, Du hättest ein Array mit mehr als einer Dimnsion
einzuhaltende Regeln: Ich kann das Array nicht über z. B. $arr[$a][$b][$c] abfragen, da $index unterschiedlich lang sein kann.
Deshalb ja die Rekursion.

Du rufst eine noch zu schreibende Funktion mit den Parametern
$array[$aktueller_schluessel] und $index_ohne_aktuellen_schluessel so lange rekursiv auf, bis $index keine Schlüssel mehr enthält.

Marilu
08.12.2005, 10:05:12
Das kriege ich hin. Aber wenn ich habe:

Gegeben: $index = "032"
Gesucht: Inhalt von $arr[0][3][2]

Dann schaffe ich es nicht, z. B. wenn $arr[0][3][2] == 0, den Wert auf 1 zu setzen.

meikel (†)
08.12.2005, 12:11:22
Das kriege ich hin.
Zeigen.
Dann schaffe ich es nicht, z. B. wenn $arr[0][3][2] == 0, den Wert auf 1 zu setzen.
Ich will sehen, ob Du mit Referenzen arbeitest.

Marilu
08.12.2005, 12:42:10
Ich will sehen, ob Du mit Referenzen arbeitest.Das war ein guter Tip. Ich sehe das Licht am Ende des Tunnels ... ich melde mich wieder.

Marilu
08.12.2005, 15:06:40
Habs hingekriegt (rekursive Funktion mit return-by-reference), aber da haste mich ganz schön gefordert! :-)))

Vielen Dank für Deine Geduld,
Greetz Marilu

meikel (†)
08.12.2005, 17:18:48
@Marilu
> Habs hingekriegt (rekursive Funktion mit return-by-reference),

Bingo.

> aber da haste mich ganz schön gefordert! :-)))

Hab ich gern gemacht, weil der Lerneffekt dadurch wesentlich nachhaltiger ist als wenn ich Dir alles haarklein vorgekaut hätte

> /Vielen Dank für Deine Geduld,

Bitte. Bei Dir lohnt es sich ja... <g>

Marilu
14.12.2005, 11:37:21
@meikel

Hat einigermaßen geklappt, aber eine Unschönheit kriege ich nicht weg. Bei dem rekursiven Erstellen eines Menüeintrags fehlt mir die Information, wann übergeordnete Array-Eintrage das jeweils letzte Element sind (hört sich kompliziert an; ich versuche mal, ein gif anzuhängen).

Vielleicht könntest Du mir etwas mehr von Deiner rekursiven Funktion zeigen?

Thx, Marilu

meikel (†)
14.12.2005, 12:20:43
Bei dem rekursiven Erstellen eines Menüeintrags fehlt mir die Information, wann übergeordnete Array-Eintrage das jeweils letzte Element sind (hört sich kompliziert an; ich versuche mal, ein gif anzuhängen).
Ja klar: Du versuchst, ein treemenu zu basteln. Nur Dein Ansatz ist dafür ungeeignet.

Vielleicht könntest Du mir etwas mehr von Deiner rekursiven Funktion zeigen?
Das dauert etwas, weil ich den Kram vorher allgemeingültig aufbereiten muß.

Marilu
14.12.2005, 12:37:37
Nur Dein Ansatz ist dafür ungeeignetDas habe ich auch befürchtet. Aber dafür habe ich jetzt Übung mit rekursiven Funktionen.

Das dauert etwas, weil ich den Kram vorher allgemeingültig aufbereiten mußLass Dir ruhig Zeit; ich bin sicher, dass ich mit Deinem 'Kram' meinen Wissenshorizont deutlich erweitern kann :-)))

meikel (†)
14.12.2005, 15:18:56
Das habe ich auch befürchtet.
Naja, ein treemenu ist nicht ohne. Besonders dann, wenn die "Äste ausklappbar" sein sollen und etwas Luxus eingebaut werden soll.

Aber dafür habe ich jetzt Übung mit rekursiven Funktionen.
Jou. Wenn man das Prinzip geschnallt hat, fängt es so langsam an, Spaß zu machen.

Marilu
16.12.2005, 20:23:28
@meikel
Du brauchst Deine Daten nicht mehr umzubauen; ich habs hingekriegt.

meikel (†)
17.12.2005, 03:07:01
@meikel
Du brauchst Deine Daten nicht mehr umzubauen; ich habs hingekriegt.
a. fein
b. kannst ja mal die relevanten Codeschnipsel als Anschauungsmaterial posten

Marilu
18.12.2005, 11:33:41
a.: finde ich auch.
b.: Gib mir noch etwas Zeit, ich will noch ein wenig Schicki-Micki einbauen. Ich maile Dir dann mal das ganze Skript.

Marilu
20.12.2005, 11:00:49
@meikel

ich habe Dir mal die notwendigen Dateien als ZIP angehängt. Einfach in einem Verzeichnis entpacken und eine entsprechende Tabelle aus menu.sql erstellen. Hinweise unter Readme.txt.

Ich erwarte gerne Deine Verbesserungen,

Greetz Marilu