Antworten auf deine Fragen:
Neues Thema erstellen

string zu array

AxelM

Nicht mehr ganz neu hier

Hallo,

ich stehe gerade etwas auf dem Schlauch.

ich habe eine Menge Strings, die folgendermaßen aufgebaut sind:
"topCat/subCat/subsubCat/endpoint" dabei ist die Anzahl der "subsubCat" variabel.

ich hätte nun gern alle Strings in einem Array nach dem Muster
array(
[0] => array(
"topCat" => array(
"subCat1" => array(...)
"subCat2" => array(...)
)
)
)

Nun ist es auch noch so, dass es sich dabei um knapp 20k Strings handelt.
Hat jemand von euch eine Idee, wie sich sowas elegant lösen lässt?

Danke schon mal für eure Antworten.
 

owieortho

Aktives Mitglied

Ich würde mittels explode (delimiter ist der slash) die strings zerlegen. Das Ergebnis ist ein array. Das Ganze liefe über eine while-Schleife bis alle strings verarbeitet sind.

O.
 

Fugel

rebmeM

PSD Beta Team
Würde es auch per explode machen, ist wohl die einfachste Möglichkeit und entspricht genau dem was du brauchst.
 

AxelM

Nicht mehr ganz neu hier

Leider ist das nicht ganz was ich brauche.
ich brauche einen array aus allen 20k strings

root
topcat1
subcat1
subsubcat1
subsubcat2
subcat2
....
topcat2
 

Fugel

rebmeM

PSD Beta Team
Na das kannst du auch für 2000k Strings nutzen. Wie sind denn die Ketten von einander getrennt?

Am besten du zeigst mal ein Bsp. von ca. 3-4 Ketten.
 

AxelM

Nicht mehr ganz neu hier

ich habe mehrere Strings wie folgt aufgebaut:
$str1 = "topcat1/subcat1/subsubcat2/../endpoint"

und aus all diesen strings will ich einen mehrdimensionalen Array konstruieren:
Dabei enthält das root element alle topCat Elemente... Jedes topcat Element all seine subcat Elemente jedes Subcat all seine Subsubcat elemente usw...
dabei haben die Strings unterschiedliche "Tiefen".
 

AxelM

Nicht mehr ganz neu hier

Um es anschaulicher zu machen:
es wären eine Menge strings, die alle Dateipfade enthalten.
und ich hätte gern einen Array, in dem quasi die Ordnerebenen abgebildet sind.
 

Fugel

rebmeM

PSD Beta Team
Na dann starte z.B. einfach eine Schleife und frag bei jedem Durchlauf ab ob die Variable $strX existiert, wenn ja machst du den explode und baust deinen mehrdemensionalen Array auf.
 

AxelM

Nicht mehr ganz neu hier

.... und baust deinen mehrdemensionalen Array auf.
Und genau das wäre der Punkt, wie ich das mache... denn die Strings sind ja unterschiedlich tief...
So mag also der eine Hauptornder mal 4 ebenen tief sein und der andere mal 6. Allerdings gibt es für jeden "Hauptordner" mehrere Strings....
 

AxelM

Nicht mehr ganz neu hier

Nein das tut explode nicht... was explode aus dem String macht ist array('TopCat', 'subCat', 'subsubCat'.... 'Endpoint');
Was ich bräcuhte ware array('Topcat' => array('subcat' => array('subsubcat' =>...)));
 

Fugel

rebmeM

PSD Beta Team
Dann zähle deinen mittels explode erstellten Array und geh dann dementsprechend eine Ebene tiefer. Sorry aber ich kann dir gerade kein Code snipped schreiben, schreibe gerade vom Handy, und das ist mehr als bescheiden.
 

Curanai

Aktives Mitglied

explode() und fertig? Nein ...

Aber explode(), mit foreach() auf dem Ergebnis, in Verbindung mit isset() über Deine array-Hierarchie und dem Einfügen, wenn !isset(); das Spiel lässt sich bis ins knauserigste Detail treiben - je Kategorie oder Pfad.

explode() gibt Dir Deine Pfade zurück - darüber regelt der Index (idx), in welcher Tiefe Du bist (scheint starr zu sein). Variabel von subsubCat ist hier störfrei. Je idx greifst Du den Pfad auf und machst letztendlich das, was Du da vor hast - persönlich fehlt mir gerade die Vorstellung, wofür man sowas braucht. Einen Verzeichnisbaum-Ansatz? However ...

Es erschließt sich mir deshalb nicht, weil ich nicht verstehe, was subCat1 und subCat2 später in ihren Arrays haben sollen. Da scheint die Ziel-Vorgabe falsch zu sein - subCat2 wäre doch eigentlich Bestandteil von subCat1? (vgl. topCat)

Und die Tiefe ist egal - darum foreach() und ganz ohne Zählen vorab (kannst auch gern mit for() machen ... viele Wege, Rom ... kennst bestimmt).

Ich gehe hier aber mit Fugel konform - zeige das Ausgangsmaterial und anhand dessen das Ziel (damit man erkennt, was wo wie zu stehen hat); das dauert keine fünf Minuten im Coding.

Heute fahre ich durch die Republik ... soll ich irgendwem von den Autobahnen aus zuwinken? :D

Viel Erfolg dennoch und

beste Grüße
 

Curanai

Aktives Mitglied

Ich bitte Dich, um helfen zu können, dass Du zwei, drei Zeilen vom Ausgangsmaterial zeigst und dann ein manuell erstelltes Array, welches Du benötigst. Dann könnte ich Dir zumindest mit einer dynamischeren Lösung helfen. Dein Beispiel bei pastebin ist dafür nicht geeignet.

Im Prinzip "EVA" erklärt - zeige mir "E" und "A" ...ich zeige Dir dann "V". :D
 

AxelM

Nicht mehr ganz neu hier

$str1 = "Lebensmittel & Getränke/Babynahrung/Glas- und Beikost/Fleischzubereitungen"
$str2 = "Lebensmittel & Getränke/Babynahrung/Glas- und Beikost/Frucht, Getreide & Joghurt Zubereitungen"
$str3 = "Lebensmittel & Getränke/Babynahrung/Glas- und Beikost/Früchte & Desserts"
$str4 = "Lebensmittel & Getränke/Babynahrung/Glas- und Beikost/Gemüse"

ergeben dann den array
$root['Lebensmittel & Getränke/Babynahrung']['Babynahrung']['Glas- und Beikost']['Fleischzubereitungen'] = array()
$root['Lebensmittel & Getränke/Babynahrung']['Babynahrung']['Glas- und Beikost']['Frucht, Getreide & Joghurt Zubereitungen']= array()
$root['Lebensmittel & Getränke/Babynahrung']['Babynahrung']['Glas- und Beikost']['Früchte & Desserts']= array()
$root['Lebensmittel & Getränke/Babynahrung']['Babynahrung']['Glas- und Beikost']['Gemüse']= array()
 

Curanai

Aktives Mitglied

Moinsen,

da es sich hierbei wohl nicht um eine Hausaufgabe handelt und auch nicht um User-Eingaben, habe ich etwas, was echt "evil", aber verdammt performanter als eben Rekursion ist.

Der "Gag" ist daher, das Konstrukt simpel als String aufzubauen - um es dann per eval() in PHP-Code zu zwingen. Aber Achtung: Das ist ausnahmslos für interna - nix für User-Eingaben o. ä.

Code:
$str1 = "Lebensmittel & Getränke/Babynahrung/Glas- und Beikost/Fleischzubereitungen";
$str2 = "Lebensmittel & Getränke/Babynahrung/Glas- und Beikost/Frucht, Getreide & Joghurt Zubereitungen";
$str3 = "Lebensmittel & Getränke/Babynahrung/Glas- und Beikost/Früchte & Desserts";
$str4 = "Lebensmittel & Getränke/Babynahrung/Glas- und Beikost/Gemüse";

$root = array();

for ($y = 1; $y <= 4; $y++) {
   $ex = explode("/", ${"str" . $y});
   
   $str = "";
   
   for (
     $dynamicLengthOfVerz = 0;
     $dynamicLengthOfVerz < count($ex);
     $dynamicLengthOfVerz++
   ) {
     $str .= "['" . $ex[ $dynamicLengthOfVerz ] . "']";
   }
   
   eval("\$root" . $str . " = array();");
}

var_dump($root);

Nein, für gewöhnlich soll man eval() nicht nehmen ... aber Rekursion ist eben was für Leute, die Zeit haben - oder das als Hausaufgabe zu lösen haben.

Sollten mehr Verzeichnisse hinzu kommen, bitte bei der äußeren for-Schleife die Anzahl erhöhen.

Nicht schlagen ... aber das war jetzt ein halber Kaffeebecher Zeitaufwand. ;)
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Statistik des Forums

Themen
118.611
Beiträge
1.538.342
Mitglieder
67.524
Neuestes Mitglied
BSKGA
Oben