Zum Inhalt springen

Eindeutige ID erzeugen


Empfohlene Beiträge

Hi,

Also ich habe folgendes Problem:

Es ist eine CSV vorhanden in der die Herachie von Produkten eingetragen ist.

1;2;3;4;5;

Produkt1;;;;;

;Produkt2;;;;

;;Produkt3;;;

;;;Produkt4;;

;;;;Produkt5;

Produkt1;;;;;

Jetzt möchte ich zu jedem Produkt abhängig von der tiefe eine eindeutige id erzeugen.

Es soll aber auch unabhängig davon sein wie Tief diese herachie geht. (Also auch tiefer als 5)

die ids sollen dann so aussehen: Produkt1: 01

Produkt2: 01.01

Produkt3: 01.01.01

Produkt4: 01.01.01.01

Produkt5: 01.01.01.01.01

Produkt1: 02

und natürlich auch hochzählen!

Bisher habe ich alles in PHP gemacht.

Ich bin soweit, dass ich die Produkte alle untereinander in einem Array gespeichert habe und kann auch passend zu jedem Produkt die Ebene ausgeben.

Desweiteren kann ich mir anhand des Headers 1;2;3;4;5 auch ausgeben lassen wie viele Ebenen es gibt.

Mein erster Ansatz war das ganze über eine Rekursion zu lösen, wobei ich allerdings kläglich gescheitert bin:(

Mir kommt immer wieder in den weg, dass es beliebig viele Ebenen sein können. Und ich so iwie kaum ne Id erzeugen kann.

Jetzt habe ich allerdings keinen Lösungsansatz mehr und hoffe das ihr mir weiter helfen könnt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde für die Datenhaltung von dieser kruden Darstellung weg und ein einfaches

GUID;Parent-GUID Modell nehmen. Also bei jedem Untergeordneten Produkt wird in die Spalte Parent-GUID die GUID des übergeordneten Produkts eingetragen. Das kannst du dann rekursiv auslesen und als Tree, oder auch in deiner Matrixform ganz einfach ausgeben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde für die Datenhaltung von dieser kruden Darstellung weg

Verstehe nicht so ganz was du meinst

Ich möchte aus der Herachie der Prudkte herraus diese Id erstellen.

01.01.01.01.01

bzw 02.03.03

oder 05.05.03.01

etc.

So erstmal mein Ansatz:

Akuelleebene ermitteln

wenn Aktuelleebene gleich der nächsten Ebene ist

Code ermitteln

wenn Aktuelleebene größer als die nächste ist

Funktion Rekursiv aufrufen (quasi so lange tiefer gehen bis ich am ende bin)

wenn Aktuelleebene kleiner als die nächste ist

Code ermitteln

Und es hapert am Code ermitteln ich bekomme es nicht hin passend hoch zu zählen und den Zähler passend zurück zu setzen und ich glaube es reichen 2 varibalen hier nicht aus!

Kann man in PHP variablen über eine zählschleife erzeugen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du brauchst z.B. einen Stack der den Pfad im darstellt. So in der Art kannst du die Hierarchie aus der Datei bestimmen, vorausgesetzt die Daten sind so angeordnet, wie du es im Beispiel angegeben hast.


stack<node> = new stack<node>(n)


while not EOF

  node = zeileLesen

  ebene = ebeneBestimmen(node)


  if (stack.top != null && stack.top.ebene > ebene)

    node.parent = stack.top

    stack.push(node)

  else

    while(stack.top != null && stack.top.ebene <= ebene)

      stack.pop()

    end while

    node.parent = stack.top

    stack.push(node)

  end if

end while

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also die Herachie kann ich schon so weit ausgeben, bekomme aber nur nullen und einsen!:-D

So sieths aus:

01

01.01

01.01.01

01.01.01 //Hier sollte egt Hochgezählt werden also 01.01.02

01. // hier auch also 02

01.01 // und hier dann natürlich auch 02.02

01.01 // Und hier 02.03

Hier mal mein bisheriger Codebrei, ich bin für jede Kritik offen;)

Variablen:

$arrayDef Hier stehn die Produkte drin Ebene+Produkt Bsp:$arrayDef[0] == 0Produkt1, $arrayDef[1] == 1Produkt2

private function writecode($parentid)

{

$zaehler=1;

$code=".0".$zaehler;

For ($this->x; $this->x < $this->anzZei; $this->x++)

{

$zahljetzt=$this->arrayDef[$this->x]{0};

if ($zahljetzt == $parentid)

{

for ($i=0;$i<=$parentid;$i++)

{

echo $code;

}

echo $this->arrayDef[$this->x];

echo '<br>';

}

else

{

if ($zahljetzt > $parentid)

{

$this->zaehlergleich=0;

$parentid=$zahljetzt;

$zaehler1=1;

for ($i=0;$i<$parentid;$i++)

{

echo $code;

}

echo $code;

echo $this->arrayDef[$this->x];

echo '<br>';

$this->x++;

$this->writecode($parentid);

}

if ($zahljetzt < $parentid)

{

$this->zaehlergleich=0;

$parentid=$zahljetzt;

for ($i=0;$i<=$parentid;$i++)

{

echo $code;

}

echo $this->arrayDef[$this->x];

echo '<br>';

$this->x++;

$this->writecode($parentid);

}

}

}

}

Zufrieden bin ich mit dem Code aber iwie auch nicht wirklich!

Link zu diesem Kommentar
Auf anderen Seiten teilen


ids = array()


while not EOF

  node = zeileLesen

  ebene = ebeneBestimmen(node)


  if (ids.length < ebene)

    ids.push(0)

    node.id = implode(".", ids)

  else

    while(ids.length > 0 && ids.length >= ebene)

      last = ids.pop()

    end while

    node.id = implode(".", ids).(last+1)

    ids.push(last+1)

  end if

end while

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...