mehrdimensionales Array mit variablen Variablen
heinetz
- php
Hallo Forum,
ich möchte aus einem String ein Element eines mehrdimansionale Arrays machen
und befüllen. Etwa so:
$string = "1,2,3,4,4";
$string_neu = "[".implode("][", explode(",", $string))."]";
//Ausgabe [1][2][3][4]
${"my_array".$string_neu} = "Wert";
echo my_array[1][2][3][4];
//Ausgabe Wert
Geht das irgendwie?. So geht es jedenfalls nicht.
Gibt es da einen Weg?
1000 Dank für Tipps und
beste gruesse,
heinetz
Hello,
ich möchte aus einem String ein Element eines mehrdimansionale Arrays machen
und befüllen. Etwa so:
Sieht mir eher so aus, als ob du aus einem Set in einem String ein Array machen willst und die Elemente des Sets nun Indexe des Arrays werden sollen?
Sowas geht selbstverständlich.
$string = "1,2,3,4,4";
$string_neu = "[".implode("][", explode(",", $string))."]";
//Ausgabe [1][2][3][4]
Statt implode müsstest Du dann explode benutzen.
Dann wäre das Array nachher allerdings "leer", hätte also erstmal keine Werte.
Oder habe ich Die verkehrt verstanden?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
ich versuche nochmal anders anzufangen ;)
ich habe:
---------
$array_1 = array{
"value" => "Wert",
"element" => "1,2,3,4,5"
};
daraus möchte ich machen:
-------------------------
$array_2[1][2][4][5] = "Wert";
Was natürlich geht ist:
-----------------------
$temp = explode(",", $array_1['element']);
$array_1[temp[0]][temp[1]][temp[2]][temp[3]] = $array_1['value'];
Das geht aber nur, wenn die Länge von $temp feststeht. Hat $array_1['element'] den Wert "1,2,3,4" wird ist:
$array_1[temp[0]][temp[1]][temp[2]][temp[3]] = $array_1['value'];
... gleichbedeutend mit:
$array_2[1][2][4][] = "Wert";
ist das verständlicher?
beste gruesse,
heinetz
Hello,
ist das verständlicher?
Nee. Um ehrlich zu sein: mir dreht sich alles im Kopf. Und ganz bestimmt nicht von den drei Gläsern Wein, die ich bisher getrunken habe. Ich wollte gerade noch ein viertes trinken, aber das kann ich mir jetzt, Dank deiner Hilfe, auch schenken.
Also nochmal von vorne:
Mal ein paar Bilder, was Du hast und was Du haben willst. Ich krieg es sonst einfach nicht gerafft. :-))
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
hi,
Nee. Um ehrlich zu sein: mir dreht sich alles im Kopf. Und ganz bestimmt nicht von den drei Gläsern Wein, die ich bisher getrunken habe. Ich wollte gerade noch ein viertes trinken, aber das kann ich mir jetzt, Dank deiner Hilfe, auch schenken.
... bei mir auch ... ohne Wein und ich merke dabei, dass ich mich an einem Nebenkriegsschauplatz festbeisse, um mich von der Arbeit abzulenken. Ich gönne mir jetzt erstmal meinen Frieden und Dir das vierte Glas ;)
feel spass,
heinetz
Hello,
Nee. Um ehrlich zu sein: mir dreht sich alles im Kopf. Und ganz bestimmt nicht von den drei Gläsern Wein, die ich bisher getrunken habe. Ich wollte gerade noch ein viertes trinken, aber das kann ich mir jetzt, Dank deiner Hilfe, auch schenken.
... bei mir auch ... ohne Wein und ich merke dabei, dass ich mich an einem Nebenkriegsschauplatz festbeisse, um mich von der Arbeit abzulenken. Ich gönne mir jetzt erstmal meinen Frieden und Dir das vierte Glas ;)
Na gut. Man muss auch mal abschalten.
Würde mich aber trotzdem interessieren, was deine Aufgabenstellung ist und ob ich die nachvollziehen kann. Ich habe ja im Wiki einen Artikel für "Arrays mal anders herum" angefangen, in dem durchaus ernstgemeinte Lösungswege abseites des Mainstreams gesammelt werden sollen. Vielleicht passt Deine Aufgabe dazu. Kann aber auch sein, dass du einfach nur nur kompliziert denkst. (einfach nur zu kompliziert... *g*)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
hi,
Würde mich aber trotzdem interessieren, was deine Aufgabenstellung ist und ob ich die nachvollziehen kann.
Ok, die Aufgabe ist liegengeblieben. Von daher fange ich nun nochmal bei 0
an:
Meine Seitenstruktur liegt in einer MySql-Tabelle als einfaches Parent-Child-Modell. Für Nested Sets haben Intelligenz und Zeit leider nicht gereicht ;) Ok, nun ist es halt so und ich muss Dinge, wie einen Bredcrump mit Rekursionen lösen. An einer Stelle benötige ich aber alle Datensätze hierarchisch. Mit einem MySQL-Statement hole ich also erstmal alle Datensätze aus der Tabelle und schreibe sie in ein Array:
while ($temp = mysql_fetch_assoc($mysqlReslt)) {
$linklist[$temp['site_id']] = $temp;
}
... das dann so aussieht:
Array
(
[1] => Array
(
[site_id] => 1
[parent_id] => 0
[order] => 1
[flag] => 0
[parents] => 0,1
[link_title] => Home 1
)
[137] => Array
(
[site_id] => 137
[parent_id] => 1
[order] => 1
[flag] => 0
[parents] => 0,1,137
[link_title] => Unser Angebot
)
[138] => Array
(
[site_id] => 138
[parent_id] => 2503
[order] => 2
[flag] => 0
[parents] => 0,1,2503,138
[link_title] => Impressum
)
... das Feld 'parents' habe ich mir schon als Hilfsfeld eingebaut, um auf Rekursionen in's Backend verlagern zu können. Das Array ist ungeordnet und ich überlege, ob ich das Array nicht gleich mit Hilfe meines Hilfsfelds 'parents' multidimensional bilden kann.
beste gruesse,
heinetz
Hello,
Meine Seitenstruktur liegt in einer MySql-Tabelle als einfaches Parent-Child-Modell. Für Nested Sets haben Intelligenz und Zeit leider nicht gereicht ;) Ok, nun ist es halt so und ich muss Dinge, wie einen Bredcrump mit Rekursionen lösen. An einer Stelle benötige ich aber alle Datensätze hierarchisch. Mit einem MySQL-Statement hole ich also erstmal alle Datensätze aus der Tabelle und schreibe sie in ein Array:
Benötigst Du wirklich alle Datensätze?
Ich habe sowas 2000 auch mal gebaut ohne Nested Sets und dann auch eine ganze Wiele im Netz stehen gehabt. Die Seite hat ein "Web im Web" angeboten und war ganz gut besucht. Es gab keine Fehler und keinen Performance-Engpass.
Da habe ich aber immer ausgehend von einem Datensatz den Baum nach oben (Richtung Root) verfolgt und die direkt untergeordneten Datensätze abgeholt. Für alle hätte mein Arbeitsspeicher kaum gereicht.
Angezeigt wurden dann allerdings nur der übergeordnete, der aktuelle und die untergeordneten Sätze.
In der Struktur waren auch Zugriffsrechte enthalten, sodass es notwendig war, immer bis Root zurückzugehen. Wenn dort eine Zugriffssperre eingetragen war, durfte der gesamte Baum ab Sperre abwärts nicht mehr ausgeliefert werden.
Die Funktionen habe ich noch. Du kannst diese frühen Elaborate gerne haben, wenn Du willst, wenn Du sie nicht veröffentlichst ;-O
Die externe Doku ist allerdings verloren gegangen. Es gibt nur noch die Kommentare im Quellcode, die aber eventuell auch reichen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
hi,
Benötigst Du wirklich alle Datensätze?
Alle Datensätze sind 600. Das finde ich nun auch nicht sooo viel. Ich brauche alle Datensätze an einer Stelle im CMS.
Die Funktionen habe ich noch. Du kannst diese frühen Elaborate gerne haben, wenn Du willst, wenn Du sie nicht veröffentlichst ;-O
Die externe Doku ist allerdings verloren gegangen. Es gibt nur noch die Kommentare im Quellcode, die aber eventuell auch reichen.
1000Dank für das Angebot, aber so schwer stelle ich mir das nicht vor. Ich habe herausgefunden, dass man so etwas machen kann:
$entry = array(
'parents' => '1,2,3,4',
'value' => 'Wert'
)
$comand = "$array[".implode('][', explode(',', $entry['parents']))."] = "".$entry['value']."";";
eval('$'.$comand);
//$array[1][2][3][4] = "Wert";
... was zugegebenermassen nicht wirklich schön ist ;)
beste gruesse,
heinetz
hi,
Benötigst Du wirklich alle Datensätze?
ich habe exakt das gefunden, was ich benötige:
Eine Parent/Child Struktur wird aus einer MySQL-Tabelle ausgelesen und ohne Rekursion und irgendwelche Selfjoins in ein multidimensionales Array (irgendwie erscheint mir der Begriff ja etwas 'überkandidelt'. Na gut jeder weiss, was gemeint ist;) geschrieben.
$mysqlStatm = "SELECT
id,
parent_id
FROM `structure` s
ORDER BY `order`";
$mysqlReslt = mysql_query($mysqlStatm);
while($data = @mysql_fetch_assoc($mysqlReslt)) {
$thisref = &$refs[$data['id']];
while (list($key, $val) = each($data)) $thisref[$key] = $val;
if ($data['parent_id'] == 0){
$list[$data['id']] = &$thisref;
}
else {
$refs[ $data['parent_id'] ]['children'][ $data['id'] ] = &$thisref;
}
}
print_r($list);exit;
Mir gefällt's ;)
best gruesse,
heinetz
Per Referenzen die Arrays erzeugen, zb.:
$array_2 = array();
$arrayRef = &$array_2;
$indices = explode(',', $array_1['element']);
$lastIndex = array_pop($indices);
foreach ($indices as $index) {
$arrayRef[$index] = array();
$arrayRef = &$arrayRef[$index];
}
$arrayRef[$lastIndex] = $array_1['value'];
Moin!
Per Referenzen die Arrays erzeugen, zb.:
$array_2 = array();
$arrayRef = &$array_2;
$indices = explode(',', $array_1['element']);
$lastIndex = array_pop($indices);
foreach ($indices as $index) {
$arrayRef[$index] = array();
$arrayRef = &$arrayRef[$index];
}
$arrayRef[$lastIndex] = $array_1['value'];
Funktioniert vermutlich (sieht gut aus, hab ich aber nicht getestet), aber die Benutzung von Referenzen halte ich für keinen guten Stil.
Insbesondere, weil dein Code am Ende eine Referenz übrigbehält, die im Prinzip nur als Hilfsvariable zur rekursiven Konstruktion des Arrays gedacht war.
- Sven Rautenberg
Hi heinetz.
ich habe:
$array_1 = array{
"value" => "Wert",
"element" => "1,2,3,4,5"
};daraus möchte ich machen:
$array_2[1][2][4][5] = "Wert";
Produziere ein Array $keyArray
, so dass
$keyArray == array(5, 4, 2, 1)
(mittels explode und array_reverse).
Dann:
$array_2 = "Wert";
foreach($keayArray as $thisValue) {
$array_2 = array($thisValue => $array_2);
}
(Ungetestet)
Aber - ohne zu wissen, was Du vorhast: Du kannst es *garantiert* vernünftiger lösen als so. Also: Was hast Du vor? :-)
Viele Grüße,
der Bademeister